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

32 投票
2 回答
10523 浏览
提问于 2025-04-16 19:43

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

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文档,也研究了一下模型对象,但我还是找不到合适的地方来做这个修改。有什么建议吗?

2 个回答

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
36

你可以这样做:

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内部的工作方式,所以不能保证它永远都能这样用。

撰写回答