2011-06-16 104 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