related_name参数在Django模型中没有按预期工作?

Mar*_*dov 27 python django

我最近在我的Django模型中遇到了一个ForeignKey冲突.我需要有两个外键(owner,assigned_to)最终指向同一个模型(用户).

根据我的理解,我需要一个related_name论据来解决这个问题.所以我这样做了:

assigned_to = models.ForeignKey(TaskUser, blank=True, null=True, related_name='user_assignment')
Run Code Online (Sandbox Code Playgroud)

owner = models.ForeignKey(TaskUser, related_name="user_ownership"
Run Code Online (Sandbox Code Playgroud)

但我仍然收到一个错误:

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'.
Run Code Online (Sandbox Code Playgroud)

为什么我仍然会收到此错误?

有一个catch,owner在超类(BaseWidget)中并且assigned_to在子类(Task)中.related_name在继承关系中使用是否存在问题?我是否需要覆盖所有者的继承并related_name在子类中重新定义?我很感激任何帮助!

Ber*_*ant 74

如果ForeignKey在抽象基类中有关系,则从中继承的每个类都将具有此关系.因此,您不能对其进行"硬编码" related_name,因为所有子类都会尝试在已实现的类上创建相同的访问器(TaskUser在本例中).

你最好做点什么:

owner = models.ForeignKey(TaskUser, related_name="%(app_label)s_%(class)s_ownership")
Run Code Online (Sandbox Code Playgroud)

请参阅django文档.


Ald*_*und 8

如果您在抽象基类中使用related_name,则需要在其中使用'%(app_label)s'和'%(class)s'.它在django doc中提到过

注意related_name