Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Django ORM выбор связаных моделей

#python #django


У меня есть 2 модели
class menu(models.Model):
    title = models.CharField(max_length=255)

class item(models.Model):
    title = models.CharField(max_length=255)
    menu = models.ForeignKey(menu)

Как при выборке связать их? Например что бы было так 
m = menu.objects.all()
for i in m.item: #?
    


Ответы

Ответ 1



К связанным моделям тут можно обратиться как m_instance.item_set. Или задать (вместо стандартного lowercased_classname_set) название в item (кстати, в Python традиционно принято именовать классы с прописной буквы) через аргумент related_name в ForeignKey(). Т.е. будет что-то в духе: for m in Menu.objects.all(): for i in m.item_set.all(): ... В документации все есть с примерами: https://docs.djangoproject.com/en/1.3/topics/db/queries/#backwards-related-objects (модели, используемые в примерах, описаны в самом верху страницы) Здесь одно большое «но» — при этом для каждого объекта в m будет выполнен запрос SELECT из таблицы с item'ами. Если записей menu много, то запросов будет, соответственно, тоже много. В этом случае, возможно, имеет смысл как-то переделать структуру и, например, как-то выбирать item'ы и их menu через select_related. В SQL это будет сформировано в духе SELECT ... FROM items AS i LEFT JOIN menus AS m ON m.item_id = i.id .... А дальше в питоновом коде уже, возможно, перестраивать структуру, в зависимости от задач.

Ответ 2



Насчет ForeignKey я точно не уверен, для ManyToManyField есть вот такое. Могу посоветовать поковырять доки, но что-то мне подсказывает, что нужно будет делать дополнительную выборку из базы, т.е.: m = menu.objects.all() for i in m: new_items = item.objects.filter(menu = i.id) PS. Названия моделей должны быть с большой буквы - правила хорошего тона.

Комментариев нет:

Отправить комментарий