У меня есть модель Person
, в которой хранятся все данные о людях. У меня также есть модель Client
, которая расширяет Person. У меня есть еще одна расширяющаяся модель OtherPerson
, которая также расширяет модель Person
. Я хочу создать Клиент, указывающий на Person
, и ТАКЖЕ создать запись OtherPerson
, которая указывает на то, что Person
. В принципе, я хочу, чтобы один объект Person
рассматривался как Client
и OtherPerson
, в зависимости от текущего вида. Возможно ли это с ORM Django, или мне нужно как-то написать Raw-запрос для создания этого сценария. Я вполне уверен, что это возможно со стороны базы данных, потому что оба дочерних класса просто указывают на родительский класс Person со своим полем person_ptr_id.Django: Два разных дочерних класса указывают на один и тот же родительский класс
Проще говоря, если я создаю Client
(и, таким образом, в Person
), можно также создать OtherPerson
объект, используя базу Person
из Client
. Таким образом, я могу рассматривать их как Client
ИЛИ как OtherPerson
, и сохранение одного будет влиять на поля Person
каждого из них?
«Горизонтальный» полиморфизм?
Вот урезанная версия моих моделей в случае, уточняет:
class Person(models.Model):
"""
Any person in the system will have a standard set of details, fingerprint hit details, some clearances and items due, like TB Test.
"""
first_name = models.CharField(db_index=True, max_length=64, null=True, blank=True, help_text="First Name.")
middle_name = models.CharField(db_index=True, max_length=32, null=True, blank=True, help_text="Middle Name.")
last_name = models.CharField(db_index=True, max_length=64, null=True, blank=True, help_text="Last Name.")
alias = models.CharField(db_index=True, max_length=128, null=True, blank=True, help_text="Aliases.")
.
.
<some person methods like getPrintName, getAge, etc.>
class Client(Person):
date_of_first_contact = models.DateField(null=True, blank=True)
.
.
<some client methods>
class OtherPerson(Person):
active_date = models.DateField(null=True, blank=True)
termination_date = models.DateField(null=True, blank=True)
.
.
<some other person methods>
Это пита, о которой я упомянул. В следующий раз не используйте подклассы, где OneToOneField будет работать лучше. –
Почему не следует использовать наследование здесь? Клиент - это лицо, другое лицо - лицо. Для меня это выглядит как недостающая функция в Django. –