如何从抽象基类重写模型字段的默认值

Joh*_*ebs 28 python django django-models

我有一些看起来像这样的代码:

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

    class Meta:
        abstract = True

class Message(BaseMessage):
    # some fields...
Run Code Online (Sandbox Code Playgroud)

我想覆盖is_publicMessage模型中字段的默认值,以便它True适用于该模型.

我查看了一些相关的Django文档,并在模型对象周围戳了一下,但我找不到合适的位置来做这件事.有什么建议?

mel*_*ath 31

您实际上可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

我这样做了一两次.它起作用,因为Message上的字段与BaseMessage上的字段不同.但是,我怀疑它的推荐;-)这在很大程度上取决于django内部当前的工作方式,因此不能保证它会永远有效.

  • 这对我有用.在我的情况下,我覆盖了帮助文本.将代码移动到初始化器中更有意义,所以我有:def __init __(self,*args,**kwargs):super(MyModelClass,self).__ init __(*args,**kwargs)self._meta. get_field('mymodelfield').help_text = self.help_text() (5认同)
  • 我尝试使用属性"unique",但我得到了这个:`AttributeError:无法设置属性`. (4认同)
  • @guettli同样在这里.似乎不适用于设置`unique`.这是在Django 1.7上. (4认同)