2011-06-16 118 views
26

已經有了一些代碼,看起來像這樣覆蓋模型字段的默認值:如何從抽象基類

class BaseMessage(models.Model): 
    is_public = models.BooleanField(default=False) 
    # some more fields... 

    class Meta: 
     abstract = True 

class Message(BaseMessage): 
    # some fields... 

,我想重寫is_public字段的默認值在消息模型中,對於該模型它是True

我已經瀏覽了一些相關的Django文檔,並在模型對象周圍戳了一些東西,但我很難找到正確的位置來執行此操作。有什麼建議麼?

回答

29

實際上,你可以做到這一點,如下所示:

class BaseMessage(models.Model): 
    is_public = models.BooleanField(default=False) 
    # some more fields... 

    class Meta: 
     abstract = True 

class Message(BaseMessage): 
    # some fields... 
Message._meta.get_field('is_public').default = True 

我曾經兩次做到了這一點。它起作用,因爲Message上的字段與BaseMessage上的字段不同。然而,我懷疑這是推薦;-)這很大程度上取決於django內部工作如何工作,所以不能保證它會永久工作。

+5

這對我有用。在我的情況下,我重寫了幫助文本。儘管如此,將代碼移入初始化程序更有意義,所以我有: def __init __(self,* args,** kwargs): super(MyModelClass,self).__ init __(* args,** kwargs) self._meta.get_field('mymodelfield')。help_text = self.help_text() – Mark 2013-07-18 18:33:02

+3

我嘗試這個屬性「唯一」,但我得到這個:'AttributeError:can not set attribute'。 – guettli 2015-11-26 11:57:26

+4

@guettli同樣在這裏。似乎不適用於設置「獨特」。這是在Django 1.7上。 – 2015-12-10 12:46:50