Django的Meta类如何工作?

我正在使用Django,它允许人们通过使用class Meta添加额外的参数。

 class FooModel(models.Model): ... class Meta: ... 

我在Python文档中唯一发现的是:

 class FooMetaClass(type): ... class FooClass: __metaclass__ = FooMetaClass 

但是,我不认为这是一回事。

你在问两个不同的事情:

  1. Django模型中的Meta内部类

    这只是一个带有一些附加到模型的选项(元数据)的类容器。 它定义了可用权限,关联数据库表名,模型是否抽象,名称的单数和复数forms等。

    简短的解释是在这里: Django文档:模型:元选项

    可用元选项列表在这里: Django文档:模型元选项

  2. 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的元类是完全不同的。