Как ссылаться на два 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()