2011-07-24 123 views
5

我有一種情況,我正在模擬一場足球比賽,每場比賽都有一組與賽事相關的事件。因此,一些有點像這樣:Django:查詢抽象基類

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_set,goal_set等。這將通過設置abstract = False並使用具體繼承來解決嗎?我讀過這樣做是a bad idea, as it introduces an extra join

處理類似情況的最佳方法是什麼?

+0

Django模型類繼承(真實或抽象)在Python意義上是* not * true繼承。這比其他任何方面都更方便。我不得不在一年前處理類似的事情,從來沒有真正找到滿意的解決方案。 –

回答

2

我同意彼得羅威爾的評論 - 模型繼承不是你想象的那樣,在我看來很少有用。

解決這個問題的更好方法是使用generic relations。所以你有一個Match模型,events = GenericRelation(),每個事件類型有一個GenericForeignKey回到匹配。那麼你可以做match.events.all()並獲得該比賽的所有單獨事件。

如果你喜歡,你仍然可以爲事件的基類使用抽象繼承,如果它們都共享某些字段,如描述和時間。

+0

感謝丹尼爾,這聽起來正是我所追求的。你知道是否可以在管理員的單個列表中管理一個對象的所有通用關係?我猜這是不可能的。 –