我有一种情况,我正在为足球比赛建模,每场比赛都有一系列与之相关的事件,与比赛期间发生的事情有关。所以有点像这样:
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 = True
,Event
个对象最终会显示pitchinvasion_set
,goal_set
等等。这可以通过设置abstract = False
并使用具体的继承来解决吗?我读过这样做是a bad idea, as it introduces an extra join。
处理这种情况的最佳方法是什么?
答案 0 :(得分:2)
我同意Peter Rowell的评论 - 模型继承并不是你认为的那样,而且在我看来很少有用。
更好的方法是使用generic relations。因此,您拥有Match
模型,其中events = GenericRelation()
,并且每种事件类型都有GenericForeignKey
返回匹配。然后你可以做match.events.all()
并获得该匹配的所有单独事件。
如果您愿意,您仍然可以为事件的基类使用抽象继承,如果它们共享一些字段,例如描述和时间。