Django的Meta类如何工作?
我正在使用Django,它允许人们通过使用class Meta
添加额外的参数。
class FooModel(models.Model): ... class Meta: ...
我在Python文档中唯一发现的是:
class FooMetaClass(type): ... class FooClass: __metaclass__ = FooMetaClass
但是,我不认为这是一回事。
你在问两个不同的事情:
-
Django模型中的
Meta
内部类 :这只是一个带有一些附加到模型的选项(元数据)的类容器。 它定义了可用权限,关联数据库表名,模型是否抽象,名称的单数和复数forms等。
简短的解释是在这里: Django文档:模型:元选项
可用元选项列表在这里: Django文档:模型元选项
-
Python中的Metaclass :
最好的描述是: 什么是Python中的元类?
在上面的Tadeck的Django答案上扩展,在Django中使用'class Meta:'也是普通的Python。
内部类是类实例之间共享数据的一个方便的名称空间(因此,元数据名称为Meta,但您可以任意调用它)。 在Django中,它通常只读configuration的东西,没有什么可以阻止你改变它:
In [1]: class Foo(object): ...: class Meta: ...: metaVal = 1 ...: In [2]: f1 = Foo() In [3]: f2 = Foo() In [4]: f1.Meta.metaVal Out[4]: 1 In [5]: f2.Meta.metaVal = 2 In [6]: f1.Meta.metaVal Out[6]: 2 In [7]: Foo.Meta.metaVal Out[7]: 2
您也可以直接在Django中探索它,例如:
In [1]: from django.contrib.auth.models import User In [2]: User.Meta Out[2]: django.contrib.auth.models.Meta In [3]: User.Meta.__dict__ Out[3]: {'__doc__': None, '__module__': 'django.contrib.auth.models', 'abstract': False, 'verbose_name': <django.utils.functional.__proxy__ at 0x26a6610>, 'verbose_name_plural': <django.utils.functional.__proxy__ at 0x26a6650>}
但是,在Django中,您更可能想要探索_meta属性,该属性是在创build模型时由模型元类创build的Options对象。 那就是你会发现所有的django类的元信息。 在Django中,Meta仅用于将信息传递到创build_meta选项对象的过程中。
Django的Model
类专门处理一个名为Meta
的属性,它是一个类。 这不是一般的Python事物。
Python的元类是完全不同的。