因此,在我们的数据库中,我们有一个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。
对不起,我没有使用真实的代码,我认为这会变得更复杂,如果不能很好地解释它,我也感到抱歉,我被剥夺了睡眠并感到压力。
谢谢!
答案 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
现在,您可以基于Car
从car_type
进入子模型。
if car.car_type === Car.CAR_A:
print(car.cara.field_a)
请注意,如果您具有许多继承级别,这将变得很麻烦,因此,我鼓励您重新考虑设计。