2016-08-03 42 views
0

有一個古老的代碼如下所示兩種型號:Django的增量ID分別

class Watermelon(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=64, default='Unnamed Watermelon') 
    is_allegic = models.BooleanField(default=False) 
    use_by = models.DateTimeField() 
    seedless = models.BooleanField(default=False) 

class Pear(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=64, default='Unnamed Pear') 
    is_allegic = models.BooleanField(default=False) 
    use_by = models.DateTimeField() 
    round_shape = models.BooleanField(default=False) 

現在我需要一個通用的水果搜索相關的功能,所以我試圖使用模型繼承,而不會干擾從舊數據中的原始ID號:

class Fruit(models.Model): 
    name = models.CharField(max_length=64, default='Unnamed Fruit') 
    is_allegic = models.BooleanField(default=False) 
    use_by = models.DateTimeField() 

class Watermelon(Fruit): 
    id = models.AutoField(primary_key=True) 
    seedless = models.BooleanField(default=False) 

class Pear(Fruit): 
    id = models.AutoField(primary_key=True) 
    round_shape = models.BooleanField(default=False) 

,這將導致該領域的「身份證」的衝突,因爲Django的不允許覆蓋在子類車型領域。

我也嘗試添加不同的下拉列表AutoField在水果模式「BASE_ID」,因爲在父模型的ID是不會被使用的。但後來我得到「django.db.utils.ProgrammingError:關於‘水果試圖運行南makemigrations時’已經存在」的錯誤。

據我所知,重編的所有ID,並分享他們與所有子類的模型可以解決問題,但我會盡量避免這種方法,因爲這些ID已經被其它表引用,也可用於其他系統。

任何意見將不勝感激。

class Fruit(models.Model): 
    name = models.CharField(max_length=64, default='Unnamed Fruit') 
    is_allegic = models.BooleanField(default=False) 
    use_by = models.DateTimeField() 

    class Meta: 
     abstract = True 

使其成爲您在使用它之前,它的子類的抽象方法:

+0

你爲什麼有西瓜和梨不同模型擺在首位的時候,幾乎所有的領域都在兩個相同的?難道你不能簡單地擁有一個FRUIT模型,並在其中指定一個名爲Fruit_name的屬性。 –

+0

我的問題是關於老改進代碼和數據遷移所以沒有什麼可以過去做。水果的事情就是一個例子。實際的子類模型有更多特定的領域。 – benny

回答

0

,如果你讓Fruit模型abstract它應該工作。這使您可以在子類上設置主鍵。

+0

感謝您的回答。我需要一個基於REST的搜索API用於父級模型Fruit,因此需要實際的數據庫表。我儘量不要查詢單獨的子類模型和聯合結果。 – benny