Страницы

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

воскресенье, 14 апреля 2019 г.

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

У меня есть 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: #?


Ответ

К связанным моделям тут можно обратиться как 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 .... А дальше в питоновом коде уже, возможно, перестраивать структуру, в зависимости от задач.

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

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