2011-04-10 115 views
17

我最近在我的Django模型中遇到了ForeignKey冲突。我需要有两个外键(owner,assigned_to)最终指向相同的模型(用户)。related_name参数在Django模型中没有像预期的那样工作?

从我的理解我需要一个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是在一个子类(任务)。在继承关系中使用related_name有问题吗?我是否需要重写所有者的继承关系,并在子类中重新定义related_name?我会很感激任何帮助!

+0

是否有可能在另一个模型/应用程序中具有相同的字段/类似的相关名称? – 2011-04-10 11:24:53

+0

我有一个由许多模型继承的BaseWidget(与所有者)。因此,几乎所有的模型都会继承BaseWidget,并因此继承所有者。 assigned_to仅存在于任务 – 2011-04-10 11:33:37

+1

BaseWidget可能是'abstract'模型吗? – 2011-04-10 11:46:30

回答

56

提到如果你有一个抽象基类,每类继承自它都会有这样的关系ForeignKey关系。因此,您不得对其related_name进行“硬编码”,因为所有子类都将尝试在已实现的类上创建相同的访问器(在这种情况下为TaskUser)。

你最好这样做:

owner = models.ForeignKey(TaskUser, related_name="%(app_label)s_%(class)s_ownership") 

查看此django docs

+0

太好了。纯粹的天才。非常感谢你! – 2011-04-11 01:41:21

+0

很好的答案,谢谢! – Vova 2017-08-23 09:03:41

+0

很好的回答!非常感谢。 – Anomitra 2017-09-06 06:52:28

相关问题