Найти - Пользователи
Полная версия: Один-ко-многим вообще есть такое в Django?
Начало » Django » Один-ко-многим вообще есть такое в Django?
1 2
quadright
Доброго времени суток, не смог найти варианты один-ко-многим, задавал ранее подобный вопрос, но меня вывели на оптимизацию варианта многие-ко-многим.
Понимаю как сделать многие-ко-многим, многие-к-одному, но один-ко-многим получается не реализован в ORM?

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

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

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

И как это должно выглядеть в структуре таблиц и связей реляционной базы данных?
quadright
FishHook
И как это должно выглядеть в структуре таблиц и связей реляционной базы данных?
Знал бы, не спрашивал
В структуре таблиц то понятно, а вот как это в ОРМ… это уже неизвестно.
GreyZmeem
>>> 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
quadright
subobjects = object.subobject_set.all()
Не получалось потому что у меня в имени объекта используется нижнее подчеркивание, жопа (иначе не скажешь) что ‘_set’ django переваривает только при именах без “_”. И вторая жопа, что этот “_set” выдает подобъекты в случае одного объекта (.get() .first() )… И окончательная жопа что это все равно одной строкой нельзя сделать, выборку объекта по значению подобъекта + чтоб несколько объектов возвращал, надеюсь понятно изъяснился ORM Django удобен, но не на все 100.

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

PS: Или что-то где-то не догнал?
GreyZmeem
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?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB