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

Аргумент 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 в подклассе? Буду признателен за любую помощь!

4b9b3361

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

Будьте осторожны с родным_имя