Как получить доступ к вложенным отношениям модели «один ко многим»? - PullRequest
1 голос
/ 18 мая 2019

У меня есть три модели, как показано ниже:

class Restaurant(models.Model):
    name = models.CharField(max_length=200)
    address = models.CharField(max_length=200)
    category = models.CharField(max_length=100, blank=True, null=True)

class MenuCategory(models.Model):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    name = models.CharField(max_length=200)


class MenuItem(models.Model):
    menu_category = models.ForeignKey(MenuCategory, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=6, decimal_places=2)

В ресторане есть много категорий меню, в которых есть много пунктов меню.

Это правильный способ выложить эти отношения? Какой самый эффективный способ получить ВСЕ пункты меню для данного ресторана?

Я надеюсь, что есть более эффективный способ, чем перебирать все категории меню для данного ресторана.

1 Ответ

2 голосов
/ 18 мая 2019

Вы можете получить все MenuItem с для данного ресторана с:

MenuItem.objects.filter(<b>menu_category__restaurant</b>=<i>my_restaurant</i>)

, где my_restaurant - это объект Restaurant, для которого вы хотите получить MenuItems.

Django создаст для этого запрос, а база данных выполнит JOIN, так что это будет выглядеть так:

SELECT menu_item.*
FROM menu_item
<b>JOIN menu_category</b>
    ON menu_item.menu_category_id = menu_category.id
WHERE menu_category.restaurant_id = <i>my_restaurant_id</i>

Поскольку ForeignKey s добавляет индексы в таблицу,обычно это СОЕДИНЕНИЕ выполняется довольно быстро.

...