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

Модель Django с двумя внешними ключами из одной таблицы

Мне нужна модель Django с двумя внешними ключами из одной таблицы. Это таблица событий, которая имеет 2 столбца для сотрудников: "актер" и "получатель". Но я получаю эту ошибку:

Ошибка: одна или несколько моделей не проверяли: tasks.task: Посредник model TaskEvent имеет более одного внешнего ключа для Employee, который неоднозначно и не допускается.

Есть ли лучший способ моделировать это? Благодаря

Думаю, я собираюсь добавить таблицу TaskEvent_to_Employee. В нем будет две записи, по одному для каждого из двух сотрудников, связанных с каждым TaskEvent. Кто-нибудь знает более легкое обходное решение?

4b9b3361

Ответ 1

Я еще не сделал этого, но я использовал inspectdb, чтобы сгенерировать файл models.py из существующей базы данных, которая делает именно это - это то, что инспектор отбросил назад, поэтому он должен работать:

creator = models.ForeignKey(Users, null=True, related_name='creator')
assignee = models.ForeignKey(Users, null=True, related_name='assignee')

Надеюсь, что это сработает для вас - если это не так, у меня тоже будет проблема.

Ответ 2

Я думаю, что вы ищете свойство related_name на ForeignKeyFields. Это позволит вам ссылаться на одну и ту же таблицу, но давать специальные имена django для отношений.

Дополнительная информация:

Ответ 3

Из сообщения об ошибке кажется, что вы пытаетесь поместить два внешних ключа в один и тот же объект в промежуточную таблицу, используемую с помощью аргумента through, в ManyToManyField, документация, для которой указано состояние:

Когда вы настраиваете посредника модели, вы явно указываете ключи к используемым моделям в отношении ManyToMany. Эта явное объявление определяет, как две модели связаны.

Есть несколько ограничений на промежуточная модель:

  • Ваша промежуточная модель должна содержать один - и только один - внешний ключ для целевая модель (это будет человек в нашем примере). Если у вас больше, чем один внешний ключ, ошибка проверки будут подняты.
  • Ваша промежуточная модель должна содержать один - и только один - внешний ключ для исходной модели (это будет группа в нашем примере). Если у вас больше, чем один внешний ключ, ошибка проверки будут подняты.

Ответ 4

Тот факт, что два столбца являются частью одной таблицы, подразумевает, что эти два поля связаны, поэтому их ссылка на них индивидуально не идеальна. ForeignKey вашей модели должен быть основным ключом таблицы, на которую вы ссылаетесь:

event = models.ForeignKey('event')

Затем вы должны ссылаться на столбцы как таковые:

foo.event.actor
foo.event.receiver

Если вы хотите, вы также можете изменить способ, которым ваш класс/модель ссылается на внешние атрибуты со свойствами. В вашем классе вы будете делать следующее:

@property
def actor(self):
  return self.event.actor
@property
def receiver(self):
  return self.event.receiver

Это позволит вам затем вызвать foo.actor и foo.receiver, но я считаю, что дольше foo.event.actor будет более pythonic