【问题标题】:How to override the default value of a Model Field from an Abstract Base Class如何从抽象基类覆盖模型字段的默认值
【发布时间】:2011-09-16 16:25:26
【问题描述】:

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

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 文档并浏览了模型对象,但我无法找到合适的位置来执行此操作。有什么建议吗?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    您实际上可以这样做:

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

    【讨论】:

    • 这对我有用。就我而言,我正在覆盖帮助文本。不过,将代码移到初始化程序中更有意义,所以我有: def __init__(self, *args, **kwargs): super(MyModelClass, self).__init__(*args, **kwargs) self._meta。 get_field('mymodelfield').help_text = self.help_text()
    • 我为属性“unique”尝试了这个,但我得到了这个:AttributeError: can't set attribute
    • @guettli 这里也一样。似乎不适用于设置unique。这是在 Django 1.7 上。
    【解决方案2】:

    对于像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
    

    【讨论】:

      猜你喜欢
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      • 2015-02-25
      • 1970-01-01
      • 2019-05-09
      • 2011-08-05
      • 1970-01-01
      相关资源
      最近更新 更多