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'.
答案 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
的实例,有两种不同的管理器方法:
user.author_article_set
- user.author_article_set.all()
将返回包含author == user
user.editor_article_set
- user.editor_article_set.all()
将返回包含editor == user
答案 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'的定义。