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

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

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

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

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

4 ответов


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

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

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


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

больше Info:


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


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

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.актер и фу.но я верю, что дольше, фу.событие.актер был бы более подходящие для Python