Аргумент related_name не работает должным образом в модели Django? - PullRequest
27 голосов
/ 10 апреля 2011

Я недавно получил столкновение ForeignKey в моей модели Django.У меня есть необходимость иметь два внешних ключа (владельца, 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'.

Почему я все еще получаю эту ошибку?

Есть одна уловка, owner в суперклассе (BaseWidget) и assigned_to в подклассе (Task).Есть ли проблемы с использованием related_name в отношениях наследования?Нужно ли просто переопределить наследование владельца и переопределить related_name в подклассе?Буду признателен за любую помощь!

Ответы [ 2 ]

73 голосов
/ 10 апреля 2011

Если у вас есть ForeignKey отношения в абстрактном базовом классе, каждый класс, унаследованный от него, будет иметь эти отношения.В результате этого вы не должны «жестко кодировать» его related_name, потому что все подклассы будут пытаться создать один и тот же метод доступа для класса realted (в данном случае TaskUser).

Вам лучше сделать что-то вроде:

owner = models.ForeignKey(TaskUser, related_name="%(app_label)s_%(class)s_ownership")

См. django docs по этому вопросу.

8 голосов
/ 10 апреля 2011

Если вы используете related_name в абстрактном базовом классе, вам нужно использовать в нем «% (app_label) s» и «% (class) s».Упоминается в django doc

Будьте осторожны с related_name

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...