django:在多表继承/多态表中自动向下转换

时间:2013-08-22 00:29:55

标签: django polymorphism multi-table-inheritance

我有这样的事情:

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后修复了删除问题。

1 个答案:

答案 0 :(得分:1)

最后,我又回到了django-polymorphic并且没有遇到过我之前遇到过的问题。