我遇到过这样的情况:我正在对一场足球比赛进行建模,每场比赛都有一组与之相关的事件,这些事件与比赛期间发生的事情有关。所以有点像这样:
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
, the Event
对象最终有一个pitchinvasion_set
, goal_set
等等, 。通过设置可以解决这个问题吗abstract = False
并使用具体继承?我读过这样做是一个坏主意,因为它引入了额外的连接 http://jacobian.org/writing/concrete-inheritance/.
处理这种情况的最佳方法是什么?
我同意 Peter Rowell 的评论 - 模型继承并不像您想象的那样,并且在我看来很少有用。
解决这个问题的一个更好的方法是通用关系 https://docs.djangoproject.com/en/1.9/ref/contrib/contenttypes/#generic-relations。所以你会有一个Match
模型,具有events = GenericRelation()
,每个事件类型都有一个GenericForeignKey
回到比赛。那么你可以做match.events.all()
并获取该比赛的所有单独事件。
如果您愿意,您仍然可以对事件的基类使用抽象继承,前提是它们确实共享一些字段(例如描述和时间)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)