【问题标题】:Override Field Option on Inherited Model in Django覆盖 Django 中继承模型的字段选项
【发布时间】:2021-02-11 10:03:25
【问题描述】:

我发现了类似的问题和答案,但似乎没有一个是完全正确的。我有一个像这样的抽象基础模型:

class BaseModel(models.Model):
    timestamp = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    description = models.CharField(max_length=512, blank=True, null=True, help_text='Help')

    class Meta:
        abstract = True

然后我继承它:

class AnotherModel(BaseModel):
    field1 = models.CharField(max_length=512)

但我希望 description 字段上的这个模型的 help_text 是别的东西,比如 help_text='Some other help text'

最好的方法是什么?我可以覆盖继承模型的字段选项吗?

【问题讨论】:

    标签: django inheritance django-models django-model-field


    【解决方案1】:

    如果这真的是关于帮助文本,我建议只覆盖 ModelForm。但是,您可以使用工厂并返回内部类:

    def base_factory(description_help: str = "Standard text"):
        class BaseModel(models.Model):
            timestamp = models.DateTimeField(auto_now_add=True)
            modified = models.DateTimeField(auto_now=True)
            description = models.CharField(
                max_length=512, blank=True, null=True, help_text=description_help
            )
    
            class Meta:
                abstract = True
    
        return BaseModel
    
    
    class ConcreteModel(base_factory("Concrete help")):
        field1 = ...
    

    【讨论】:

    • help_text 只是一个示例,因此非常感谢您提供概括性的答案。我可能做错了事,但在某些情况下,似乎有必要只覆盖子类上的字段选项(例如,Django 管理员)。这看起来是一个有趣的解决方案。
    • 不,这很常见。但我倾向于将基类限制为仅可自定义的字段。很容易混合多个。比如我经常用name = models.CharField()(品类名,衬衫名,狗名,随便你)。但是长度可能会有所不同,因此您可以使用此模式来控制最大长度。
    • 是的,完全正确。这基本上就是我正在做的事情:在我的特定情况下,修改、时间戳、名称和描述。因此,为了使这个更通用,我只需向base_factory 添加更多参数?比如def base_factory(description_help: str = "Help", name_default: str = "Name" ):等?
    • 是的,没错。如果您得到超过 5 个参数,您可能希望将一个或多个字段分开,但这只是一个经验法则,而不是一些黄金标准。只要明白,你在一个工厂中打包的参数越多,它被广泛重用的机会就越小。
    • 再次感谢您对此的帮助。我最终使用ModelForm help_texts 属性作为帮助文本,但是模型工厂的这个想法在其他地方确实帮助了我。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    相关资源
    最近更新 更多