我最近在我的Django模型中遇到了一个ForeignKey冲突。我需要有两个外键(owner,assigned_to)最终指向同一个模型(用户)。
根据我的理解,我需要一个related_name
参数来解决这个问题。所以我这样做了:
assigned_to = models.ForeignKey(TaskUser, blank=True, null=True, related_name='user_assignment')
和
owner = models.ForeignKey(TaskUser, related_name="user_ownership"
但我仍然收到错误:
tasks.task: Accessor for field 'owner' clashes with related field 'TaskUser.user
_ownership'. Add a related_name argument to the definition for 'owner'.
tasks.task: Reverse query name for field 'owner' clashes with related field 'TaskUser.user_ownership'. Add a related_name argument to the definition for 'owner'.
为什么我仍然会收到此错误?
有一个catch,owner
在超类(BaseWidget)中,assigned_to
在子类(Task)中。在继承关系中使用related_name
是否存在问题?我是否需要覆盖所有者的继承并重新定义子类中的related_name
?我很感激任何帮助!
答案 0 :(得分:71)
如果在抽象基类中有ForeignKey
个关系,则从中继承的每个类都将具有此关系。因此,您不能对其related_name
进行“硬编码”,因为所有子类都会尝试在已实例化的类(TaskUser
上创建相同的访问器)。
你最好做点什么:
owner = models.ForeignKey(TaskUser, related_name="%(app_label)s_%(class)s_ownership")
请参阅此处的django docs。
答案 1 :(得分:7)
如果在抽象基类中使用related_name,则需要在其中使用'%(app_label)s'和'%(class)s'。 它在django doc中提到