Django使用代理模拟复杂的继承

时间:2012-08-28 14:24:30

标签: python django django-models django-inheritance

我有这些模特:

class Base(models.Model):
    # ... attributes
    def f(self):
        raise Exception()

class A(Base):
    attribute = models.IntegerField()

class B(A):
    class Meta:
        proxy = True
    def f(self):
        print "B", attribute

class C(A):
    class Meta:
        proxy = True
    def f(self):
        print "C", attribute

现在我和他们玩了一下,但我发现了一个问题:

c = C()
c.attribute = 1
c.save()

b = Base.objects.all()
b.f() # Aspected "C 1" to be printed, exception fired instead!

最后一行以意想不到的方式运作!为了更好地查看文档,我搜索了Django自动向下转换属性,但我发现只有A()类中没有B()或{{1}自动转换的类}。

当我保存数据时,还有一种保存继承的方法吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

根据文档,Queryset仍会返回请求的模型。见here

在您的示例中,您将返回原始模型的查询集Base。