如何从抽象基类重写模型字段的默认值
我有一些代码,看起来像这样:
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内部的工作方式,所以不能保证它永远都能这样用。