2

我有这样的事情:

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

4

1 回答 1

1

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

于 2014-01-09T16:37:47.687 回答