在Django中管理继承

时间:2018-10-11 03:41:54

标签: python django inheritance

因此,在我们的数据库中,我们有一个Car模型,但是可能有不同种类的汽车,它们具有不同的字段和不同的过程,因此我制作了一些从该Car继承的模型类,就像这样:

class Car(models.Model):
    field = models.CharField(max_length=300)


class CarA(Car):
    field_a = models.CharField(max_length=300)


class CarA1(CarA):
    field_a1 = models.CharField(max_length=300)


class CarA2(CarA):
    field_a2 = models.CharField(max_length=300)


class CarB(Car):
    field_b = models.CharField(max_length=300)

也有旅行,每次旅行都有与之相关的汽车:

class Trip(BaseModel):
    car = models.ForeignKey(Car)

如果我有一个CarA1实例car_a1,则可以使用car_a1.car_ptr将其保存在Trip中,但是它将保存为Car,因此我认为没有办法再次获取CarA1实例,除了在所有子类中按Car ID搜索。

所以,如果我想知道这次旅行的是哪种汽车,或者想要获得一个特定的子类字段,那就真的很复杂。

您建议做什么?我只能保留具有特定字段可为空(field_a,field_b等)的Car类,以及一个用于指定汽车种类的字段,但这似乎不对,我必须检查种类以验证字段等。但是现在看来,这是更好的解决方案。

我正在使用Django 1.11和Python 3.6 btw。

对不起,我没有使用真实的代码,我认为这会变得更复杂,如果不能很好地解释它,我也感到抱歉,我被剥夺了睡眠并感到压力。

谢谢!

2 个答案:

答案 0 :(得分:3)

模型中的问题是,当引入的新型汽车说出c时,您需要为此创建另一个表。这并不理想,您需要一个表来存储汽车的详细信息(常用),并在单独的表中显示“属性”以存储其他详细信息并提供与汽车模型的外键关系。

答案 1 :(得分:1)

首先,您可以从父模型进入子模型(请参见model based inheritance)。

如果您要坚持基于继承的设计,可以在Car中定义一个名为car_type的字段,该字段与子表的类型相对应。例如:

class Car(models.Model):
    CAR_A = 'car_a'
    CAR_B = 'car_b'
    CAR_TYPE_CHOICES = (
        (CAR_A, 'Car_A'),
        (CAR_B, 'Car_b'),
    )
    field = models.CharField(max_length=300)
    car_type = models.CharField(max_length=20, choices=CAR_TYPE_CHOICES)

然后您可以覆盖子模型的save方法,以使它们的car_type字段与其模型相对应。

class CarA(Car):
    field_a = models.CharField(max_length=300)

    def save(self, *args, **kwargs):
        self.car_type = Car.CAR_A
        super(CarA, self).save(*args, **kwargs)

# ... similarly for CarB

现在,您可以基于Carcar_type进入子模型。

if car.car_type === Car.CAR_A:
    print(car.cara.field_a) 

请注意,如果您具有许多继承级别,这将变得很麻烦,因此,我鼓励您重新考虑设计。