2013-08-22 85 views
1

我有這樣的事情:Django的:在多表繼承自動溯造型/多態性表

class Base(Model): 
    ... 
    def downcast(self): 
     try: 
      return self.childa 
     except: 
      pass 
     try: 
      return self.childb 
     except: 
      pass 
     return self 


class ChildA(Base): 
    .... 

class ChildB(Base): 
    .... 

class Foo(Model): 
    child = ForeignKey(Base) 

每當我有一個Foo對象,孩子外鍵始終是基地的一個實例 - 我的理解是這是Django是如何工作的。現在我已經向Base添加了downcast()方法(參見上文)。我不介意對可能的派生類型進行硬編碼。

我想是以某種方式在Foo中自動集中化該自動降級。我將這個多表繼承添加到現有的代碼中,並且我始終找到代碼真正需要它的實例 - 因此我必須在代碼中手動向下進行本地下注。

我正在使用django-polymorphic包,但它給了我一些副作用,我不知道如何也不想處理(就像我不能刪除行 - 得到一些關於opts.pk的錯誤沒有太深的查詢集代碼。)

所以我想知道 - 將__init __()(在調用基類init後)是否可以?有沒有我沒有想到的副作用?這似乎是從頭開始創建新實例時可能會遇到的問題。

def __init__(*args, **kwargs): 
    super(Base, self).__init__(*arg, **kwargs) 
    self.child = self.child.downcast() 

我應該重新命名孩子嗎?

class Foo(Model): 
    child_poly = ForeignKey(Base) # was child 
    @property 
    def child(self): 
     return self.child_poly.downcast() 

從零開始創建Foo()時,這可能是一個問題。我不能說Foo(孩子= c)。

有沒有更好的方法?不尋找一個通用的多態解決方案/混入 - 而不是在嘗試調試django並發現刪除django-polymorphic修復了刪除問題之後。

+1

你試過哪個版本的django-polymorphic?這一個https://github.com/chrisglass/django_polymorphic似乎維護得很好。如果是這樣,我建議你發佈你遇到的問題/錯誤。如果你已經做到了,我的道歉。 – mtnpaul

+0

如果需要向下轉換,您可能需要嘗試[InheritanceManager](https://django-model-utils.readthedocs.org/en/latest/managers.html#inheritancemanager)形式的django-model-utils。 –

+0

這是django_polymorphic-0.5.tar.gz。我沒有提交錯誤信息 - 本來希望的是,但我得到的只是django查詢代碼中的堆棧跟蹤。我找到了它,並沒有覺得我真的可以正確地描述正在發生的事情,但是當django訪問opts.pk.name時,我會得到opts.pk爲None。 – rrauenza

回答

1

最後,我回到了django-polymorphic,並沒有遇到過我再次遇到的問題。