【发布时间】:2020-02-04 17:13:04
【问题描述】:
假设我们有一个父抽象模型AModel,它定义了一个字段foo:
class AModel(models.Model):
class Meta:
abstract = True
foo = models.TextField(max_length=500, db_index=True)
我们有两个抽象模型类BModel 和CModel 继承自AModel:
class BModel(AModel):
class Meta:
abstract = True
class CModel(AModel):
class Meta:
abstract = True
我们有一个模型类DModel,它继承自BModel 和CModel:
class DModel(BModel, CModel):
这里的问题是foo 字段会与自身发生冲突,因为它是在两个父模型类中定义的。
如何解决这个问题?有没有一种“Django”方法来防止这种行为?
【问题讨论】:
-
我不是 100%,但我猜 Python 方法解析顺序会自动处理它。如果一个类直接实现
foo,则将使用该类,否则它将使用深度优先从左到右搜索该字段,在您的情况下以DModel开头,那么它是第一个父BModel,发现它在BModel的父AModel中。 -
@NicoGriffioen:MRO 确实会将其线性化。但是 Django 的逻辑会检查父母,并且确实报告了“冲突”。
-
@NicoGriffioen 实际上这是我现在面临的一个问题,实际上它报告了正在继承的字段的冲突。