我无法理解为什么某些模型中存在某些属性,所以我希望有人可以在这里解释它们。
这是一个基本的例子:
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.
答案 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 inheritance和Inheritance and reverse relations文档。