Python 在Django中管理继承

Python 在Django中管理继承,python,django,inheritance,Python,Django,Inheritance,所以,在我们的数据库中,我们有一个汽车模型,但可能有不同种类的汽车,有不同的字段和与之相关联的不同进程,所以我创建了一些从汽车继承的模型类,如下所示: 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 = mo

所以,在我们的数据库中,我们有一个汽车模型,但可能有不同种类的汽车,有不同的字段和与之相关联的不同进程,所以我创建了一些从汽车继承的模型类,如下所示:

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\u a1
,我可以用
car\u a1.car\u ptr
在旅行中保存它,但是它会被保存为car,从那里我认为除了在所有子类中搜索car id之外,没有办法再次获得CarA1实例

所以,如果我想知道旅行中有哪种类型的车,或者得到一个特定的子类字段,这将非常复杂

你建议做什么?我只能让特定字段为空的Car类(field_a、field_b等)和一个用于指定汽车类型的字段,但这似乎不正确,我必须检查该类以验证字段,等等。但现在这似乎是更好的解决方案

顺便说一句,我正在使用Django 1.11和Python 3.6

对不起,我没有使用真正的代码,我想它会更复杂,也很抱歉,如果我没有解释清楚,我的睡眠剥夺和压力


谢谢

您的模型中的问题是,当引入一种新类型的汽车时,比如说汽车c,您需要为此创建另一个表。这并不理想,您需要的是一个表来存储汽车详细信息(常用)和单独的表来存储其他详细信息,并为汽车模型提供外键关系。

首先,您可以从父模型获取子模型(请参阅)

如果要坚持基于继承的设计,可以在
Car
中定义一个名为
Car\u 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\u 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
现在,您可以根据其
Car\u类型
Car
获取子模型

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

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

字段是否表示相同类型的数据?不,例如,在我的项目中,有些字段是外键。我不确定如何执行此操作。在我的代码中,某些类型的汽车对用户具有外键,而其他类型的汽车对部门具有外键。那些桌子怎么样?我还需要在旅行中存储一辆车,我还会存储一辆车吗?添加两个属性user和dept,并允许black和null true。如果有用户,则将其添加或留空。我不能在不知道完整模型结构的情况下说一个微调模型。我刚刚检查了一下,在汽车模型上会有3个可为空的字段(其中一些字段实际上是必需的,取决于汽车的类型),你仍然认为这是一个好主意吗?我认为最好像你说的那样,对字段使用单独的表,但我仍然不知道如何做。谢谢!我已经在重新考虑设计了,这也是我在这里提问的部分原因。