Аргумент related_name не работает должным образом в модели Django?
Недавно я получил столкновение ForeignKey в моей модели Django. Мне нужно иметь два внешних ключа (owner, assign_to), в конечном счете указывающие на одну и ту же модель (пользователь).
Из того, что я понимаю, мне нужен аргумент related_name
для решения этой проблемы. Поэтому я сделал это:
assigned_to = models.ForeignKey(TaskUser, blank=True, null=True, related_name='user_assignment')
и
owner = models.ForeignKey(TaskUser, related_name="user_ownership"
Но я все еще получаю сообщение об ошибке:
tasks.task: Accessor for field 'owner' clashes with related field 'TaskUser.user
_ownership'. Add a related_name argument to the definition for 'owner'.
tasks.task: Reverse query name for field 'owner' clashes with related field 'TaskUser.user_ownership'. Add a related_name argument to the definition for 'owner'.
Почему я все еще получаю эту ошибку?
Существует один catch, owner
находится в суперклассе (BaseWidget), а assigned_to
- в подклассе (Task). Существуют ли проблемы с использованием related_name
в отношении наследования? Нужно ли просто переопределять наследование владельца и переопределять related_name
в подклассе? Буду признателен за любую помощь!
Ответы
Ответ 1
Если у вас есть отношения ForeignKey
в абстрактном базовом классе, каждый класс, наследующий от него, будет иметь это отношение. В результате этого вы не должны "жестко закодировать" его related_name
, потому что в этом случае все под-классы будут пытаться создать тот же аксессуар в реальном классе (TaskUser
).
Вам лучше сделать что-то вроде:
owner = models.ForeignKey(TaskUser, related_name="%(app_label)s_%(class)s_ownership")
Смотрите django docs на этом.
Ответ 2
Если вы используете related_name в абстрактном базовом классе, вам нужно использовать '% (app_label) s' и '% (class) s' в нем.
Он упоминается в django doc
Будьте осторожны с родным_имя