首页 文章

抽象Django类中的多个外键字段

提问于
浏览
2

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

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

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

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

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

相关问题