Модель наследования или внешний ключ? - PullRequest
0 голосов
/ 10 сентября 2018

Я уверен, что, возможно, есть несколько способов сделать то, что я делаю, но столкнулся с некоторыми проблемами. У меня есть модель «Член», и я также пытаюсь добавить «Зависимую» модель, которая наследует некоторые поля и данные от родителя (члена), но также имеет некоторые из тех же полей, но свои собственные данные. Каков наилучший способ достичь этого? ForeignKey, OneToOne или ManyToMany, или это вообще возможно?

Пример:

class Member(models.Model):
    name = models.CharField(max_length=128)
    address = models.CharField(max_length=128)
    age = models.DateField()

class Dependent(models.Model):
    name = models.CharField(max_length=128) (different name)
    address = models.CharField(max_length=128) (same address as Member)
    age = models.DateField() (different age)

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 10 сентября 2018

Поскольку Dependent имеет те же поля, что и Member, но имеет некоторые дополнительные поля, вы можете сделать так, чтобы Dependent и Member наследовали абстрактный базовый класс (спасибо @WillemVanOnsem за указание это), чтобы избежать переопределения одних и тех же полей, и поскольку Member и Dependent имеют отношения родитель-потомок, вы должны добавить внешний ключ к Member в качестве дополнительного поля в модели Dependent. Вы также можете переопределить метод save для Member, чтобы он синхронизировал адреса своих Dependent дочерних элементов при сохранении.

class Person(models.Model):
    name = models.CharField(max_length=128)
    address = models.CharField(max_length=128)
    age = models.DateField()

    class Meta:
        abstract = True

class Member(Person):
    def save(self):
        super().save()
        self.dependents.exclude(address=self.address).update(address=self.address)

class Dependent(Person):
    parent = models.ForeignKey(Member, related_name='dependents')
    extra_field = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...