【问题标题】:How to fix fields clashes when using models multi-inheritance in django在 django 中使用模型多继承时如何修复字段冲突
【发布时间】: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)

我们有两个抽象模型类BModelCModel 继承自AModel

class BModel(AModel):

    class Meta:
        abstract = True


class CModel(AModel):

    class Meta:
        abstract = True

我们有一个模型类DModel,它继承自BModelCModel

class DModel(BModel, CModel):

这里的问题是foo 字段会与自身发生冲突,因为它是在两个父模型类中定义的。

如何解决这个问题?有没有一种“Django”方法来防止这种行为?

【问题讨论】:

  • 我不是 100%,但我猜 Python 方法解析顺序会自动处理它。如果一个类直接实现foo,则将使用该类,否则它将使用深度优先从左到右搜索该字段,在您的情况下以DModel开头,那么它是第一个父BModel,发现它在 BModel 的父 AModel 中。
  • @NicoGriffioen:MRO 确实会将其线性化。但是 Django 的逻辑会检查父母,并且确实报告了“冲突”。
  • @NicoGriffioen 实际上这是我现在面临的一个问题,实际上它报告了正在继承的字段的冲突。

标签: python django


【解决方案1】:

我认为这是不可能的。您将需要修改模型的层次结构。

使用Python's inheritance + models.Model 也不起作用。例如做class AModel:class BModel(AModel):class CModel(AModel):,然后class DModel(BModel, CModel, models.Model): 将不起作用。

阅读django abstract models versus regular inheritance

【讨论】:

    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    相关资源
    最近更新 更多