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

时间:2011-06-16 19:43:40

标签: 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...

我想覆盖Message模型中is_public字段的默认值,以便该模型为True

我查看了一些相关的Django文档,并在模型对象周围进行了调查,但是我找不到合适的位置。有什么建议吗?

2 个答案:

答案 0 :(得分:30)

您实际上可以按照以下方式执行此操作:

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内部当前的工作方式,因此不能保证它会永远有效。

答案 1 :(得分:0)

对于像 max_length 这样的验证级别重载,可以将其添加到 apps.py ready 方法

from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _


class MyAppConfig(AppConfig):
    name = "myapp"
    verbose_name = _("myapp")

    def ready(self):
        from myapp.models import MyModel

        # HACK: to set max_length for field when you can't change
        # this on parent model for example when inheriting from third
        # party app
        MyModel._meta.get_field('field').max_length = 128