我有一个抽象基类,它向用户模型声明了两个外键字段:
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_by
和updated_by
都会出现以下错误:
myapp.ClassA.updated_by:(fields.E305)“ClassB.updated_by”的反向查询名称与“ClassB.updated_by”的反向查询名称冲突。
提示:将“related_name”参数添加或更改为“ClassA.updated_by”或“ClassB.updated_by”的定义。
即使我已经设置了related_name。它只适用于声明的两个外键字段之一。
是否可以在抽象类中为同一模型提供两个外键字段,如果是,我该如何设置它?
答案 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。