模型元类与模型形式元类有何不同?

Posted

技术标签:

【中文标题】模型元类与模型形式元类有何不同?【英文标题】:How is model Meta class different from model form Meta class? 【发布时间】:2021-12-15 02:04:15 【问题描述】:

我想了解我们在模型中使用的元类。我在文档中找到了它。我记得在模型表单中也添加了元类。似乎模型元类和模型形式元类是不同的。它们有何不同以及模型表单中的元选项是什么。

【问题讨论】:

【参考方案1】:

在认识论中,meta 是一个(古)希腊词,意思是关于。因此,它是一个描述模型或ModelForm关于 的类。名字基本上是他们唯一的共同点。

模型的Meta 类将指定模型的详细名称等,在相应的数据库表中定义的约束和索引等。Django 文档中有一个section that lists all the Meta options for a model。

另一方面,ModelFormMeta 将向ModelForm 解释它应该如何为给定模型构造表单。通常,Meta 定义了ModelFormfieldsexclude 一起构造的模型,它们分别指定要包含/排除的字段。此外,Overriding default fields section of the documentation 列出了所有其他Meta 选项,用户可以(稍微)更改在ModelForm 中定义字段的方式。 source code [GitHub] 还列出了ModelFormMeta 的所有选项:

class ModelFormOptions:
    def __init__(self, options=None):
        self.model = getattr(options, 'model', None)
        self.fields = getattr(options, 'fields', None)
        self.exclude = getattr(options, 'exclude', None)
        self.widgets = getattr(options, 'widgets', None)
        self.localized_fields = getattr(options, 'localized_fields', None)
        self.labels = getattr(options, 'labels', None)
        self.help_texts = getattr(options, 'help_texts', None)
        self.error_messages = getattr(options, 'error_messages', None)
        self.field_classes = getattr(options, 'field_classes', None)

【讨论】:

以上是关于模型元类与模型形式元类有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

Python基础入门自学——12--new方法和元类

exec模块,元类与ORV的应用

在 Groovy 中,实例的元类与其类的元类有啥区别

16 元类

django 模型元类的标准文档字符串是啥?

Python 元类与类装饰器