2011-02-14 79 views
0

我試圖繼承類模板,讓我所有的車型都有一定的默認領域,並都像save_model()的一些功能Django的模型類的繼承 - 默認領域和覆蓋

如果默認覆蓋我不喜歡這樣,我得到了覆蓋,但後來不得不去手動設置像db_table元數據...

class ModelExtension(models.Model): 
    altered_by = models.CharField(max_length=64) 

class SomeModel(ModelExtension): 
    class Meta: 
     db_table = 'app_somemodel' 
    fields = models.CharField() 
    ... 

有沒有辦法讓這種遺產的工作吧?到目前爲止,我要麼做額外的工作來彌補這種方法的缺點,要麼我受到MRO錯誤的困擾.2

回答

3

什麼是MRO錯誤?你讀過關於模型繼承的django文檔嗎?您可以具有抽象基類,多表繼承或代理模型。

http://docs.djangoproject.com/en/1.2/topics/db/models/#abstract-base-classes

你所做的事有一個多表繼承 - 有一個隱藏OneToOneField連接您的兩款車型。我不知道爲什麼你認爲你需要指定的db_table - 它不應該是。

如果您永遠不會擁有裸類ModelExtension的對象,那麼您需要抽象基類。在這種情況下,您在Meta部分中放置了abstract = True,然後將基類中的所有字段添加到子類的表中。文檔比我在這裏解釋得更好。

我經常發現自己開始做這件事,然後,因爲我覺得我的更多的數據庫結構來回翻轉幾次....

+0

如果我沒有指定db_table,所有繼承的模型都有一個db_table'app_modelextension' – samurailawngnome 2011-02-15 03:30:58

+0

呵呵,好的。我認爲abstract = True已經做到了。 – samurailawngnome 2011-02-15 03:34:58

0

如果你只是想新功能添加到模型沒有改變它的領域,使用proxy model