django:在多表继承中遵循向后到子类的关系

Jam*_*mie 5 django inheritance foreign-key-relationship

我欢迎任何有关我的问题的帮助。我试图在多表继承情况下将关系向后跟踪到子类。

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

这是我的问题的一个简化示例(对 django 文档中的eg进行修改);

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)
Run Code Online (Sandbox Code Playgroud)

如果我尝试,state.restaurant_set.all()我会收到异常

“State”对象没有属性“Restaurant_set”

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

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

任何帮助将不胜感激

gru*_*gru 1

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

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

但要小心,因为此类查询往往非常昂贵,并且您可能需要通过使用select_latedprefetch_lated语句来调整获取内容的方式

  • 感谢您的回复,我想鉴于我已经实现了多表继承并且可以“Restaurant.state”,我也可以“state.restaurant_set.all()”。必须将ForeignKey('State')移动到每个子类中会有点烦人...... (3认同)