#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. Названия моделей должны быть с большой буквы - правила хорошего тона.
Комментариев нет:
Отправить комментарий