【问题标题】:Multiple foreign key fields in abstract Django class抽象 Django 类中的多个外键字段
【发布时间】:2016-06-10 21:02:06
【问题描述】:

我有一个抽象基类,它向用户模型声明了两个外键字段:

class BaseModel(models.Model):
    updated = models.DateTimeField(null=True)
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name="updated_by")
    created = models.DateTimeField(null=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name="created_by")

    class Meta:
        abstract=True

我有多个继承自此类的类。当我运行makemigrations 时,对于每个可能的类对以及created_byupdated_by,我都会收到以下错误:

myapp.ClassA.updated_by:(fields.E305)“ClassB.updated_by”的反向查询名称与“ClassB.updated_by”的反向查询名称冲突。

提示:在 'ClassA.updated_by' 或 'ClassB.updated_by' 的定义中添加或更改相关名称参数。

即使我已经设置了相关名称。它只适用于声明的两个外键字段之一。

一个抽象类中的同一个模型是否可以有两个外键字段,如果可以,我该如何设置?

【问题讨论】:

标签: python django django-models


【解决方案1】:

由于您多次使用related_name,在您继承的模型类中,用户模型的相关名称不明确并发生冲突。

您必须为每个模型设置不同的相关名称。

【讨论】:

    【解决方案2】:

    这是documentation 中提到的预期行为。

    要解决此问题,当您在抽象基类(仅)中使用related_name 时,名称的一部分应包含'%(app_label)s''%(class)s'

    class BaseModel(models.Model):
        updated = models.DateTimeField(null=True)
        updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name="updated%(app_label)s_%(class)s_related")
        created = models.DateTimeField(null=True)
        created_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, related_name="created%(app_label)s_%(class)s_related")
    
        class Meta:
            abstract=True
    

    【讨论】:

    猜你喜欢
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 2023-04-11
    • 2011-08-05
    • 2011-11-23
    • 2010-09-26
    • 2016-06-10
    相关资源
    最近更新 更多