2010-01-06 41 views
3

我有兩個模型比從相同的抽象基類繼承。我如何獲得繼承自同一個父類的所有實例django

我希望能夠從作爲基類的東西,如AbstractClass.objects.all()班的孩子得到所有實例

當然,我可以對所有兒童連接查詢但這是可怕和它會停止工作,如果我添加新的兒童班。

這可能與Django ORM?什麼是優雅的解決方案?

回答

1

我使用過django的其他繼承方法,因爲我遇到了同樣的問題。我不確定是否有優雅的解決方案。最終,您需要在數據庫上完成幾個查詢,並將結果合併到一起。我無法想象支持這一點的ORM。

下面是這種情況下我平時的hackish辦法:

class NotQuiteAbstractBaseClass(models.Model): 
    def get_specific_subclass(self): 
     if self.model1: 
      return self.model1 
     elif self.model2: 
      return self.model2 
     else: 
      raise RuntimeError("Unknown subclass") 

class Model1(NotQuiteAbstractBaseClass): 
    def whoami(self): 
     return "I am a model1" 

class Model2(NotQuiteAbstractBaseClass): 
    def whoami(self): 
     return "I am a model2" 

然後,您可以查詢整個列表如下:

for obj in NotQuiteAbstractBaseClass.objects.iterator(): 
    obj = obj.get_specific_subclass() 
    print obj.whoami() 
+0

我會等待一點點希望更好,但到目前爲止,似乎多個查詢是要走的路。你有一個聰明的方式來處理添加新的子類,或者如果添加更多的子類,你是否必須更新查詢? 我有相當多的OOP經驗,但只在80小時前開始Python,所以我非常有限。我確信有一種方法可以使它具有可調用函數的動態性。 – philgo20 2010-01-06 20:43:31

+0

我也等着看看能否得到更好的答案。這是我的一個長期存在的問題。我使用標準的django繼承和查詢抽象基類。這裏的問題是你得到基類的實例,而不是你想要的特定子類。爲了解決這個問題,我在某個地方註冊了每個子類。然後我在我的基類上放了一個'get_specific_subclass()'方法。這基本上在數組上循環,並測試我們是否可以將其轉換爲該類型。我很想聽到更好的解決方案。我的方法完成了這項工作,但並不覺得「正確」。 – Gattster 2010-01-06 20:54:23

+0

「我使用標準的django繼承和查詢抽象基類。」那是什麼意思 ?你能舉一個你在ABC上查詢的例子嗎?沒有設法做到這一點。 – philgo20 2010-01-07 14:23:53

相關問題