理解Django模型继承怪癖

时间:2012-03-28 07:34:34

标签: django

我无法理解为什么某些模型中存在某些属性,所以我希望有人可以在这里解释它们。

这是一个基本的例子:

class Alpha(models.Model):
    one = models.PositiveIntegerField()


class Bravo(Alpha):
    two = models.PositiveIntegerField()


class Charlie(Alpha):
    three = models.PositiveIntegerField()


"bravo" in dir(Charlie())
True

Charlie的实例如何拥有bravo属性?是否有一个原因?我错过了什么吗?

更重要的是,为什么这会阻止我向bravo类添加Charlie属性?

...
class Charlie(Alpha):
    three = models.PositiveIntegerField()
    bravo = models.TextField()


Charlie()
ValueError: Cannot assign "''": "Charlie.bravo" must be a "Bravo" instance.

2 个答案:

答案 0 :(得分:4)

据我所知,这是因为父类对其所有后代都有一个隐式外键,后者又由子进程继承。事实上这可能不应该发生,但可能没有办法阻止它。

一种可能性可能是Bravo上的explicitly set the parent link,因此related_name不是'bravo',所以你可以在Charlie中重复使用这个名字。

class Bravo(Alpha):
    two = models.PositiveIntegerField()
    alpha = models.OneToOneField(Alpha, parent_link=True, related_name='not_bravo')

答案 1 :(得分:2)

继承关系引入子模型与其每个父模型之间的链接(通过自动创建的OneToOneField)。

在你的情况下,这意味着在定义Bravo时,Alpha会被称为“bravo”。

请参阅Multi-table inheritanceInheritance and reverse relations文档。