Модель Django с двумя внешними ключами из одного стола - PullRequest
43 голосов
/ 24 февраля 2009

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

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

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

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

Ответы [ 5 ]

77 голосов
/ 24 февраля 2009

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

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

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

7 голосов
/ 25 февраля 2009

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

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

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

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

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

Подробнее:

1 голос
/ 20 ноября 2018

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

class Sample(models.model):
    ...

class Mymodel(models.model):
    example1 = models.ForeignKey(Sample, related_name='sample1')
    example2 = models.ForeignKey(Sample, related_name='sample2')
0 голосов
/ 24 февраля 2009

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

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