我有一些看起来像这样的代码:
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文档,并在模型对象周围进行了调查,但是我找不到合适的位置。有什么建议吗?
答案 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