我有这样的事情:
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 的一些错误在查询集中没有深度代码。)
所以我想知道——在 __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(child=c)。
有更好的方法吗?不是在寻找通用的多态解决方案/mixin——不是在尝试调试 django 并发现删除 django-polymorphic 修复了删除问题之后。