Django:查询抽象基类

时间:2011-07-24 19:14:49

标签: django inheritance django-models

我有一种情况,我正在为足球比赛建模,每场比赛都有一系列与之相关的事件,与比赛期间发生的事情有关。所以有点像这样:

class Event(models.Model):
    time = models.IntegerField()
    class Meta:
        abstract = True

class Goal(Event):
    scorer = models.ForeignKey('Player')

class PitchInvasion(Event):
    number_of_people = models.IntegerField()

class FootballMatch(models.Model):
    events = models.ForeignKey('Event')

原谅这个备受瞩目的例子,但是它表明这些Event的子类可以是任何东西。我当时想做的是能够查询所有这些事件并按时订购,以按时间顺序查看该比赛中发生的事情。

但是,对于abstract = TrueEvent个对象最终会显示pitchinvasion_setgoal_set等等。这可以通过设置abstract = False并使用具体的继承来解决吗?我读过这样做是a bad idea, as it introduces an extra join

处理这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

我同意Peter Rowell的评论 - 模型继承并不是你认为的那样,而且在我看来很少有用。

更好的方法是使用generic relations。因此,您拥有Match模型,其中events = GenericRelation(),并且每种事件类型都有GenericForeignKey返回匹配。然后你可以做match.events.all()并获得该匹配的所有单独事件。

如果您愿意,您仍然可以为事件的基类使用抽象继承,如果它们共享一些字段,例如描述和时间。