Подтвердить что ты не робот

Сообщение об ошибке Django "Добавить аргумент related_name в определение"

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

Ответ 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')

Это лучше объяснить в документах