Я хочу создать объект, который содержит 2 ссылки на пользователей. Например:
class GameClaim(models.Model):
target = models.ForeignKey(User)
claimer = models.ForeignKey(User)
isAccepted = models.BooleanField()
но я получаю следующие ошибки при запуске сервера:
Аксессор для поля «target» конфликтует со связанным полем «User.gameclaim_set». Добавьте аргумент related_name в определение для «target».
Аксессор для поля 'claimer' конфликтует со связанным полем 'User.gameclaim_set'. Добавьте аргумент related_name к определению «claimer».
Не могли бы вы объяснить, почему я получаю ошибки и как их исправить?
python
django
django-models
Олег тарасенко
источник
источник
related_name
в документации] ** ( docs.djangoproject.com/en/dev/ref/models/fields/#arguments ) объяснит, почему они происходят.Ответы:
У вас есть два внешних ключа для пользователя. Django автоматически создает обратную связь между пользователем и GameClaim, что обычно и происходит
gameclaim_set
. Однако, поскольку у вас есть два FK, у вас будет дваgameclaim_set
атрибута, что, очевидно, невозможно. Поэтому вам нужно указать Django, какое имя использовать для обратного отношения.Используйте
related_name
атрибут в определении FK. напримеристочник
User
Модель пытается создать два поля с таким же именем, один дляGameClaims
которых есть , что ,User
какtarget
и другой дляGameClaims
что есть что ,User
какclaimer
. Вот документыrelated_name
, которые позволяют Django задавать имена атрибутов, чтобы сгенерированные автоматически не конфликтовали.источник
OP не использует абстрактный базовый класс ... но если вы это сделаете, вы обнаружите, что жесткое кодирование related_name в FK (например ..., related_name = "myname") приведет к ряду этих ошибок конфликта - по одному на каждый унаследованный класс от базового класса. Приведенная ниже ссылка содержит обходной путь, который прост, но определенно не очевиден.
Из документов Django ...
Больше информации здесь .
источник
Иногда вам нужно использовать дополнительное форматирование
related_name
- фактически, в любое время, когда используется наследование.Здесь нет конфликта, но related_name определяется один раз, и Django позаботится о создании уникальных имен отношений.
тогда у детей класса Value у вас будет доступ к:
источник
Кажется, я иногда сталкиваюсь с этим, когда добавляю подмодуль в качестве приложения в проект django, например, учитывая следующую структуру:
Если я добавлю следующее в INSTALLED_APPS:
Кажется, Django дважды обрабатывает файл myapp.mymodule models.py и выдает вышеуказанную ошибку. Это можно решить, не включив основной модуль в список INSTALLED_APPS:
Включение
myapp
вместо вместоmyapp.module
приводит к тому, что все таблицы базы данных создаются с неправильными именами, так что, похоже, это правильный путь.Я наткнулся на этот пост, когда искал решение этой проблемы, так что решил, что я бы поставил это здесь
источник
Просто добавив к ответу Джордана (спасибо за подсказку Джордан), это также может произойти, если вы импортируете уровень выше приложений, а затем импортируете приложения, например
myproject/ apps/ foo_app/ bar_app/
Так что, если вы импортируете приложения, foo_app и bar_app, вы можете получить эту проблему. У меня были приложения, foo_app и bar_app, все они перечислены в настройках. INSTALLED_APPS
И вы все равно хотите избегать импорта приложений, потому что тогда у вас одно и то же приложение установлено в 2 разных пространствах имен
apps.foo_app
иfoo_app
источник