【问题标题】:related_name argument not working as expected in Django model?related_name 参数在 Django 模型中没有按预期工作?
【发布时间】:2011-04-10 11:22:50
【问题描述】:

我最近在我的 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'.

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

有一个问题,owner 在超类 (BaseWidget) 中,assigned_to 在子类 (Task) 中。在继承关系中使用related_name 是否存在问题?我是否需要重写所有者的继承并在子类中重新定义related_name?如有任何帮助,我将不胜感激!

【问题讨论】:

  • 您是否可能在另一个模型/应用程序中也有相同的字段/字段具有相似的相关名称?
  • 我有一个 BaseWidget(带有所有者),它被许多模型继承。所以几乎我所有的模型都会继承 BaseWidget 并因此拥有所有者。 assign_to 仅存在于任务中
  • BaseWidget 可能是abstract 模型吗?
  • 是的,先生,这是一个抽象模型。

标签: python django


【解决方案1】:

如果您在抽象基类中有ForeignKey 关系,则从它继承的每个类都将具有这种关系。因此,您不能“硬编码”它的related_name,因为所有子类都将尝试在 realted 类上创建相同的访问器(在这种情况下为TaskUser)。

你最好这样做:

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

请参阅django docs

【讨论】:

  • 太棒了。纯属天才。非常感谢!
  • 很好的答案!非常感谢。
  • 你能解释一下这个“%(app_label)s_%(class)s_ownership”扩展成什么吗?那些我之前没见过的 % 标志是什么?
  • @Mr.SuryaaJha 来自django docs%(class)s 替换为该字段所在子类的小写名称,%(app_label)s 替换为该字段的小写名称应用子类包含在其中。
  • 哦,我看到了@EyongKevinEnowanyo,这是 Django 魔法的罕见案例之一
【解决方案2】:

如果您在抽象基类中使用related_name,您需要在其中使用“%(app_label)s”和“%(class)s”。 它在 django 文档中提到

Be careful with related_name

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-11
    • 1970-01-01
    • 2021-01-31
    • 2021-09-23
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多