django:跟随关系向后转到多表继承中的子类

时间:2015-12-12 10:36:42

标签: django inheritance foreign-key-relationship

我欢迎任何有关我的问题的帮助。我试图在多表继承情况下向后关注一个子类。

即。我想要一个特定州所有餐馆的查询集。

这是我的问题的简化示例(例如在django的文档中的修改);

from django.db import models

class Place(models.Model):
    state = models.ForeignKey('State')
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

class Restaurant(Place):
    serves_hot_dogs = models.BooleanField(default=False)
    serves_pizza = models.BooleanField(default=False)

class State(models.Model):
    state = models.CharField(max_length=50)

如果我尝试state.restaurant_set.all(),我会收到例外

  

'州'对象没有属性'Restaurant_set'

但是,如果我尝试使用state.place_set.all(),我会收到该状态的一组查询,但我真的只想要该州的餐馆。

任何人都可以就如何正确制定我的查询集提供一些建议,或提供一些其他如何实现这一目标的建议吗?

非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

在您的Place模型中,您已将外键定义为State,从而可以使用语句state.place_set.all()进行反向查找。 相反,您的Restaurant模型中没有任何外键指向State,因此您无法运行反向查找。

您应该在Restaurant中添加一个指向Place的外键,这样您就可以从州获取地点,然后从地点获取餐馆。或者,甚至可能更好,Place中的多个关系指向Restaurant,这样来自State的反向查找会更容易。

要小心,因为这类查询往往非常昂贵,而且您可能需要使用select_relatedprefetch_related语句来解释您获取内容的方式

答案 1 :(得分:0)

您无法从StateRestaurant向后关注外键,但您可以通过使用餐馆的继承外键过滤来获得相同的结果: / p>

restaurants = Restaurant.objects.filter(state=state)