簡體   English   中英

在Django中管理繼承

[英]Managing inheritance in Django

因此,在我們的數據庫中,我們有一個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。

抱歉,我沒有使用真實的代碼,我認為這會更復雜,如果不能很好地解釋它,也感到抱歉,我睡眠不足,壓力很大。

謝謝!

您模型中的問題是,當引入的新型汽車說出汽車c時,您需要為此創建另一個表。 這不是理想的選擇,您需要一個表來存儲汽車的詳細信息(常用),而單獨的表顯示存儲其他詳細信息並提供與汽車模型的外鍵關系的屬性。

首先,您可以從父模型進入子模型(請參閱基於模型的繼承 )。

如果您希望堅持基於繼承的設計,則可以在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_typeCar子模型。

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

請注意,如果您具有許多繼承級別,這將變得很麻煩,因此,我鼓勵您重新考慮您的設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM