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'.
Сообщение об ошибке Django "Добавить аргумент related_name в определение"
Ответ 1
У вас есть несколько внешних ключей, которые django не может генерировать уникальные имена для.
Вы можете помочь, добавив аргументы "related_name" в определения полей foreignkey в ваших моделях. Например:
content_type = ForeignKey(Topic, related_name='topic_content_type')
Подробнее см. здесь. http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.related_name
Ответ 2
Пример:
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()
вернет Queryset всех объектов статьи, у которых есть автор == user -
user.editor_article_set
-user.editor_article_set.all()
вернет Queryset всех объектов статьи, у которых есть редактор == user
Ответ 3
"Если у модели есть ForeignKey, экземпляры модели внешнего ключа будут иметь доступ к Менеджеру, который возвращает все экземпляры первой модели. По умолчанию этот менеджер называется FOO_set, где FOO является именем исходной модели, строчный".
Но если у вас есть несколько внешних ключей в модели, django не может генерировать уникальные имена для менеджера внешнего ключа.
Вы можете помочь, добавив аргументы "related_name" в определения полей foreignkey в ваших моделях.
Смотрите здесь: https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward
Ответ 4
Сделайте так, чтобы сообщение об ошибке указывало вам:
Добавьте аргумент related_name в определение для "создателя".
Ответ 5
Но в моем случае я создаю отдельное приложение для некоторых функций с тем же именем и полем (copy/paste;)), что из-за этого типа ошибок я просто удалил старую модель, и код будет работать нормально < ш > Может быть, полная помощь для начинающих, таких как я:)
Ответ 6
Это не окончательный ответ на вопрос, однако для кого-то он может решить проблему. У меня была такая же ошибка в моем проекте после проверки действительно старого фиксации (переход в состояние отсоединенной головки), а затем восстановление базы кода. Решение заключалось в том, чтобы удалить все *.pyc файлы в проекте.
Ответ 7
Если ваши модели наследуются от одной родительской модели, вы должны установить уникальное related_name
в родительском ForeignKey. Например:
author = models.ForeignKey('accounts.User', related_name='%(app_label)s_%(class)s_related')
Это лучше объяснить в документах