【问题标题】:Django error message "Add a related_name argument to the definition"Django 错误消息“将相关名称参数添加到定义”
【发布时间】:2011-02-06 01:33:17
【问题描述】:
D:\zjm_code\basic_project>python manage.py syncdb
Error: One or more models did not validate:
topics.topic: Accessor for field 'content_type' clashes with related field 'Cont
entType.topic_set'. Add a related_name argument to the definition for 'content_t
ype'.
topics.topic: Accessor for field 'creator' clashes with related field 'User.crea
ted_topics'. Add a related_name argument to the definition for 'creator'.
topics.topic: Reverse query name for field 'creator' clashes with related field
'User.created_topics'. Add a related_name argument to the definition for 'creato
r'.
topicsMap.topic: Accessor for field 'content_type' clashes with related field 'C
ontentType.topic_set'. Add a related_name argument to the definition for 'conten
t_type'.
topicsMap.topic: Accessor for field 'creator' clashes with related field 'User.c
reated_topics'. Add a related_name argument to the definition for 'creator'.
topicsMap.topic: Reverse query name for field 'creator' clashes with related fie
ld 'User.created_topics'. Add a related_name argument to the definition for 'cre
ator'.

【问题讨论】:

  • 如果您不知道“related_name”参数是什么,则错误消息说明不是很有用。 Django“相关对象”文档不一定有帮助;他们没有定义related_name,也没有明确表示您可以为您的related_name 发明任何您想要的值。

标签: django


【解决方案1】:

例子:

class Article(models.Model):
    author = models.ForeignKey('accounts.User')
    editor = models.ForeignKey('accounts.User')
    

这将导致错误,因为 Django 尝试自动为 accounts.User 的实例创建一个反向关系,为每个与用户的外键关系,如 user.article_set。此默认方法不明确。 user.article_set.all() 是指作者字段相关的用户文章,还是编辑字段相关的文章?

解决方案:

class Article(models.Model):
    author = models.ForeignKey('accounts.User', related_name='author_article_set')
    editor = models.ForeignKey('accounts.User', related_name='editor_article_set')

现在,对于用户user 的实例,有两种不同的管理器方法:

  1. user.author_article_setuser.author_article_set.all() 将返回一个包含作者 == 用户的所有文章对象的查询集

  2. user.editor_article_setuser.editor_article_set.all() 将返回一个包含编辑器 == 用户的所有文章对象的查询集


注意: 这是一个老例子——on_delete 现在是models.ForeignKey 的另一个必需参数。详情What does on_delete do on Django models?

【讨论】:

  • 解释得很漂亮。非常感谢。
  • 这是一个比公认的更好的答案。感谢您提供清晰的解释和示例!
  • 如果您也可以详细说明 on_delete 参数,那就太好了,@MarkCharkerian
  • @NeilG 我添加了一个链接。
【解决方案2】:

如果您的模型继承自同一个父模型,您应该在父模型的 ForeignKey 中设置一个唯一的 related_name。例如:

author = models.ForeignKey('accounts.User', related_name='%(app_label)s_%(class)s_related')

在 th 中解释得更好

【讨论】:

    【解决方案3】:

    当我尝试为一个可以从同一个表格中提取足球队名称的表格编写解决方案时,我遇到了类似的问题。 我的桌子是这样的:

    hometeamID = models.ForeignKey(Team, null=False, on_delete=models.CASCADE)
    awayteamID = models.ForeignKey(Team, null=False, on_delete=models.CASCADE)
    

    进行以下更改解决了我的问题:

    hometeamID = models.ForeignKey(Team, null=False, on_delete=models.CASCADE,related_name='home_team')
    awayteamID = models.ForeignKey(Team, null=False, on_delete=models.CASCADE,related_name='away_team')
    

    【讨论】:

      【解决方案4】:

      如果您的模型继承自同一个父模型,您应该在父模型的 ForeignKey 中设置一个唯一的related_name。例如:

      author = models.ForeignKey('accounts.User', related_name='%(app_label)s_%(class)s_related')

      docs中解释得更好

      【讨论】:

        【解决方案5】:

        这不是问题的最终答案,但对于某些人来说,它可能会解决问题。 在检查了一个非常旧的提交(进入分离的头部状态)然后将代码库恢复到最新状态后,我在我的项目中遇到了同样的错误。解决方案是删除项目中的所有 *.pyc 文件。

        【讨论】:

          【解决方案6】:

          但在我的情况下,我正在为具有相同模型名称和字段(复制/粘贴;)的某些功能创建一个单独的应用程序,这是因为发生了这种类型的错误,我只是删除了旧模型并且代码可以正常工作 可能对像我这样的初学者有帮助:)

          【讨论】:

            【解决方案7】:

            "如果模型有 ForeignKey,则外键模型的实例将有权访问返回第一个模型的所有实例的 Manager。默认情况下,此 Manager 名为 FOO_set,其中 FOO 是源模型名称,小写。”

            但如果模型中有多个外键,django 无法为外键管理器生成唯一名称。
            您可以通过在模型中的外键字段定义中添加“related_name”参数来提供帮助。

            请看这里: https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward

            【讨论】:

            • 成功的一半是理解错误消息的含义。我发现这个简单的解释(带有链接)非常有帮助。
            【解决方案8】:

            按照错误消息的指示进行操作:

            将related_name 参数添加到 “创造者”的定义。

            【讨论】:

            • 是的,太好了,那我就去related_name="foobar"?那样可以么?可能是!我怎么知道?我没有!
            【解决方案9】:

            您有许多外键,django 无法为其生成唯一名称。

            您可以通过在模型中的外键字段定义中添加“related_name”参数来提供帮助。 例如:

            content_type = ForeignKey(Topic, related_name='topic_content_type')
            

            请参阅此处了解更多信息。 http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name

            【讨论】:

            • 或者只是related_name='+'
            • @HuckleberryFinn,+ 是做什么的?
            • related_name='+' 确实抑制了错误,但请注意其目的 - 选择退出“向后”链接。 IE:fooo_set 在外部实例上使用将无法在此处找到正在使用它的实例。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-28
            • 2018-05-30
            • 2022-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多