我有这样的事情:
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对象时,子外键总是Base的一个实例 - 我的理解是Django的工作方式。现在我已经向Base添加了一个downcast()方法(参见上文)。我不介意硬编码可能的派生类型。
我想要的是以某种方式在Foo中自动集中转发。我将这个多表继承添加到现有代码中,并且我一直在寻找代码真正需要它向下转发的实例 - 所以我必须在代码中本地手动转发它。
我正在使用django-polymorphic包,但是它给了我一些副作用我不知道如何/也不想处理(就像我不能删除行 - 得到一些关于opts.pk为none的错误深入查询集代码。)
所以我想知道 - 在__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)。
有更好的方法吗?不寻找通用的多态解决方案/ mixin - 不是在尝试调试django并发现删除django-polymorphic后修复了删除问题。
答案 0 :(得分:1)
最后,我又回到了django-polymorphic并且没有遇到过我之前遇到过的问题。