我有這樣的事情: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修復了刪除問題之後。
你試過哪個版本的django-polymorphic?這一個https://github.com/chrisglass/django_polymorphic似乎維護得很好。如果是這樣,我建議你發佈你遇到的問題/錯誤。如果你已經做到了,我的道歉。 – mtnpaul
如果需要向下轉換,您可能需要嘗試[InheritanceManager](https://django-model-utils.readthedocs.org/en/latest/managers.html#inheritancemanager)形式的django-model-utils。 –
這是django_polymorphic-0.5.tar.gz。我沒有提交錯誤信息 - 本來希望的是,但我得到的只是django查詢代碼中的堆棧跟蹤。我找到了它,並沒有覺得我真的可以正確地描述正在發生的事情,但是當django訪問opts.pk.name時,我會得到opts.pk爲None。 – rrauenza