Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Один-ко-многим вообще есть такое в Django? [RSS Feed]

#1 Июль 29, 2014 12:03:10

quadright
Зарегистрирован: 2013-07-26
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Один-ко-многим вообще есть такое в Django?

Доброго времени суток, не смог найти варианты один-ко-многим, задавал ранее подобный вопрос, но меня вывели на оптимизацию варианта многие-ко-многим.
Понимаю как сделать многие-ко-многим, многие-к-одному, но один-ко-многим получается не реализован в ORM?

object(models.Model):
    name = models.CharField()
subobject(models.Model):
    name = models.CharField()
    object = models.ForeignKey(object)

Хочу сделать один запрос и получить все объекты с подобъектами, такое возможно?

Отредактировано quadright (Июль 29, 2014 12:04:21)

Офлайн

#2 Июль 29, 2014 12:53:27

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Один-ко-многим вообще есть такое в Django?

А чем отличается многие-к-одному от один-ко-многим?



Офлайн

#3 Июль 29, 2014 13:11:34

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Один-ко-многим вообще есть такое в Django?

object.subobject_set.all()

Офлайн

#4 Июль 30, 2014 05:24:46

quadright
Зарегистрирован: 2013-07-26
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Один-ко-многим вообще есть такое в Django?

FishHook
А чем отличается многие-к-одному от один-ко-многим?
Многие-к-одному - могу получить объект через подобъект
object_name = db.subobject.objects.get(id=1).object.name
А как одним запросом получить подобъекты через объект (один-ко-многим)?

Офлайн

#5 Июль 30, 2014 05:29:30

quadright
Зарегистрирован: 2013-07-26
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Один-ко-многим вообще есть такое в Django?

GreyZmeem

То есть в коде прописываю
subobjects = object.subobject_set.all()
И получаю список подобъектов? Сами попробуйте?
Испробывал эту идею всяко ( типа так db.object.objects.subobject_set.all() и разные вариации ), но то ли с синтаксисом ошибся или не знаю.

Офлайн

#6 Июль 30, 2014 06:24:22

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Один-ко-многим вообще есть такое в Django?

FishHook
А чем отличается многие-к-одному от один-ко-многим?
quadright
Многие-к-одному - могу получить объект через подобъект

И как это должно выглядеть в структуре таблиц и связей реляционной базы данных?



Офлайн

#7 Июль 30, 2014 06:36:41

quadright
Зарегистрирован: 2013-07-26
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Один-ко-многим вообще есть такое в Django?

FishHook
И как это должно выглядеть в структуре таблиц и связей реляционной базы данных?
Знал бы, не спрашивал
В структуре таблиц то понятно, а вот как это в ОРМ… это уже неизвестно.

Отредактировано quadright (Июль 30, 2014 06:37:24)

Офлайн

#8 Июль 30, 2014 08:47:39

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Один-ко-многим вообще есть такое в Django?

>>> m = Manufacturers.objects.all().first()
>>> m
<Manufacturers: Skoda>
>>> m.carmodels_set.all()
[<CarModels: Skoda -> Octavia>, <CarModels: Skoda -> Fabia>, <CarModels: Skoda -> Fabia Combi>, ...]
>>>

quadright, почитайте про related objects

Отредактировано GreyZmeem (Июль 30, 2014 08:48:06)

Офлайн

#9 Июль 30, 2014 11:47:37

quadright
Зарегистрирован: 2013-07-26
Сообщения: 75
Репутация: +  1  -
Профиль   Отправить e-mail  

Один-ко-многим вообще есть такое в Django?

subobjects = object.subobject_set.all()
Не получалось потому что у меня в имени объекта используется нижнее подчеркивание, жопа (иначе не скажешь) что ‘_set’ django переваривает только при именах без “_”. И вторая жопа, что этот “_set” выдает подобъекты в случае одного объекта (.get() .first() )… И окончательная жопа что это все равно одной строкой нельзя сделать, выборку объекта по значению подобъекта + чтоб несколько объектов возвращал, надеюсь понятно изъяснился ORM Django удобен, но не на все 100.

GreyZmeem
quadright, почитайте про related objects
Читал, и до этого читал, как и раньше понял что реализовано только многие-к-одному и многие-ко-многим. А один-ко-многим от многие-многим отличается отсутствием связующей таблицы, достаточно лишь ForeignKey у подобъектов сделать. Буду значит многие-ко-многим использовать.

PS: Или что-то где-то не догнал?

Офлайн

#10 Июль 30, 2014 12:39:04

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Один-ко-многим вообще есть такое в Django?

quadright
что ‘_set’ django переваривает только при именах без “_”
Неправда.

class MyModel_Author(models.Model):
    name = models.CharField(max_length=254)
    def __unicode__(self):
        return self.name
class MyModel_Book(models.Model):
    name = models.CharField(max_length=254)
    author = models.ForeignKey('MyModel_Author')
    def __unicode__(self):
        return u'{}: {}'.format(self.author.name, self.name)

>>> a1 = MyModel_Author.objects.create(name='Author 1')
>>> a2 = MyModel_Author.objects.create(name='Author 2')
>>>
>>> MyModel_Book.objects.create(name='Book 1', author=a1)
>>> MyModel_Book.objects.create(name='Book 2', author=a1)
>>> MyModel_Book.objects.create(name='Book 3', author=a1)
>>> MyModel_Book.objects.create(name='Book 4', author=a2)
>>> MyModel_Book.objects.create(name='Book 5', author=a2)
>>> MyModel_Book.objects.create(name='Book 6', author=a2)
>>>
>>> a1.mymodel_book_set.all()
[<MyModel_Book: Author 1: Book 1>, <MyModel_Book: Author 1: Book 2>, <MyModel_Bo
ok: Author 1: Book 3>]
>>> a2.mymodel_book_set.all()
[<MyModel_Book: Author 2: Book 4>, <MyModel_Book: Author 2: Book 5>, <MyModel_Bo
ok: Author 2: Book 6>]
>>>


quadright
И вторая жопа, что этот “_set” выдает подобъекты в случае одного объекта (.get() .first() )
А зачем возвращать _set для всей модели?? Если уж сильно хочется, то:
Можно вернуть список PK
>>> MyModel_Author.objects.all().values_list('mymodel_book', flat=True)
[1L, 2L, 3L, 4L, 5L, 6L]
>>>
Можно выбрать по другому:
>>> MyModel_Book.objects.filter(author__in=MyModel_Author.objects.all())
[<MyModel_Book: Author 1: Book 1>, <MyModel_Book: Author 1: Book 2>, <MyModel_Book: Author 1: Book 3>, <MyModel_Book: Author 2: Book 4>, <MyModel_Book: Author 2: Book 5>, <MyModel_Book: Author 2: Book 6>]
>>>


quadright
И окончательная жопа что это все равно одной строкой нельзя сделать, выборку объекта по значению подобъекта
И опять неверно.
>>> MyModel_Author.objects.filter(mymodel_book__name__iendswith='3')
[<MyModel_Author: Author 1>]
>>>

quadright
Читал, и до этого читал, как и раньше понял что реализовано только многие-к-одному и многие-ко-многим.
А чем отличается one-to-many от many-to-one?

Офлайн

  • Начало
  • » Django
  • » Один-ко-многим вообще есть такое в Django?[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version