Как ссылаться на два ForeignKeys в одной модели

Я хочу сделать следующее: у меня есть три класса, производные от абстрактного класса:

class Person(models.Model):
  name = models.CharField()
  ...
  class Meta:
    abstract = True

class TypA(Person):
  ...

class TypB(Person):
  ...

class TypC(Person):
  ...

В другом классе я хотел бы сослаться на TypA и TypB как на внешний ключ, примерно так:

class Project(models.Model):
  worker = models.ForeignKey(TypA or TypB)

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

Другая идея заключается в использовании limit_choices_to декларация для иностранных ключей.

worker = models.ForeignKey(Person, limit_choices_to={??})

Но это невозможно, как кажется:

Field defines a relation with model 'Person', which is either not installed, or is abstract.

Заранее благодарю за помощь.

2 ответа

Решение

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

Аналогично, внешний ключ базы данных может ссылаться только на одну таблицу, а не на две.

Если вам действительно нужно гибкое отношение к нескольким видам таблиц, единственная возможность, которую я вижу, - это структура типов контента Django.

Вы также хотите ограничить виды моделей, на которые вы можете указать. Для этого лучше посмотреть на Как я могу ограничить GenericForeignKey Джанго в список моделей? для примера.

Вам просто нужно сослаться на ваш абстрактный класс (например, JAVA):

class Project(models.Model):
    worker = models.ForeignKey(Person)


#in your code:
worker = TypeA()
worker.save()
proj = Project()
proj.worker = worker
proj.save()
Другие вопросы по тегам