如何访问模型的嵌套一对多关系?

时间:2019-05-18 17:30:00

标签: python django orm django-rest-framework

我有三个模型,如下所示:

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 个答案:

答案 0 :(得分:2)

您可以通过以下方式获得给定餐厅的所有MenuItem

MenuItem.objects.filter(menu_category__restaurant=my_restaurant)

其中 my_restaurant 是要为其检索Restaurant的{​​{1}}对象。

Django将为此构造一个查询,并且数据库将执行JOIN,如下所示:

MenuItems

由于SELECT menu_item.* FROM menu_item JOIN menu_category ON menu_item.menu_category_id = menu_category.id WHERE menu_category.restaurant_id = my_restaurant_id将索引添加到表中,因此通常此JOIN操作非常快。