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

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

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

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

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

Ответов (5)

Решение

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

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

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

Моим решением было использование related_name :

class Sample(models.model):
    ...

class Mymodel(models.model):
    example1 = models.ForeignKey(Sample, related_name='sample1')
    example2 = models.ForeignKey(Sample, related_name='sample2')

Тот факт, что два столбца являются частью одной таблицы, означает, что эти два поля связаны, поэтому ссылаться на них по отдельности не идеально. 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 будет более питоническим

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

Больше информации:

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

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

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

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