Django错误消息“向定义添加related_name参数”

时间:2010-04-09 09:13:19

标签: django

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'.

10 个答案:

答案 0 :(得分:95)

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

您可以通过向模型中的foreignkey字段定义添加“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

答案 1 :(得分:28)

示例:

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_set - user.author_article_set.all()将返回包含author == user

  2. 的所有文章对象的Queryset
  3. user.editor_article_set - user.editor_article_set.all()将返回包含editor == user

  4. 的所有文章对象的Queryset

答案 2 :(得分:12)

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

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

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

答案 3 :(得分:1)

当我尝试为一个表编写解决方案时会遇到类似的问题,该解决方案会从同一张表中提取足球队的名称。 我的桌子看起来像这样:

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 :(得分:0)

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

答案 5 :(得分:0)

如果您的模型是从同一父模型继承而来,则应在父计算机的 ForeignKey 中设置唯一的related_name。例如:

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

最好在docs

中进行解释

答案 6 :(得分:0)

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

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

最好在 th 中解释

答案 7 :(得分:-1)

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

答案 8 :(得分:-1)

我只是在我的应用中删除

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'whitenoise.runserver_nostatic',
    'django.contrib.staticfiles',
    # 'users.apps.UsersConfig',
    'schemas',
]

并评论

# AUTH_USER_MODEL = "User"

答案 9 :(得分:-3)

执行错误消息指示您:

  

将一个related_name参数添加到   'creator'的定义。