Django:查询抽象基类

Sam*_*ing 5 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')
Run Code Online (Sandbox Code Playgroud)

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

然而,对于abstract = True,Event对象最终得到一个pitchinvasion_set,goal_set等等.这可以通过设置abstract = False和使用具体的继承来解决吗?我已经读到这样做是一个坏主意,因为它引入了额外的连接.

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

Dan*_*man 3

我同意 Peter Rowell 的评论 - 模型继承并不像您想象的那样,并且在我看来很少有用。

解决这个问题的更好方法是使用通用关系。因此,您将拥有一个Match带有 的模型events = GenericRelation(),并且每个事件类型都有一个GenericForeignKey返回 Match。然后您可以match.events.all()获取该比赛的所有单独事件。

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