抽象Django类

时间:2016-02-27 16:22:27

标签: python django django-models

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

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”的反向查询名称冲突。

     

提示:将“related_name”参数添加或更改为“ClassA.updated_by”或“ClassB.updated_by”的定义。

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

是否可以在抽象类中为同一模型提供两个外键字段,如果是,我该如何设置它?

2 个答案:

答案 0 :(得分:4)

这是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

答案 1 :(得分:0)

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

您必须为每个模型设置不同的related_name。