我正在使用Django,它允许人们使用class Meta
为类添加额外的参数。
class FooModel(models.Model):
...
class Meta:
...
我在Python的文档中找到的唯一一件事是:
class FooMetaClass(type):
...
class FooClass:
__metaclass__ = FooMetaClass
但是,我不认为这是一回事。
您在问两个不同的问题:
Meta
内部类:
这只是一个类容器,其中包含一些附加到模型的选项(元数据)。它定义了诸如可用权限,关联数据库表名,模型是否抽象,名称的单数和复数等内容。
简短的解释在这里:Django docs: Models: Meta options
可用元选项列表如下:Django docs: Model Meta options扩展Tadeck的Django上面的答案,在Django中使用'class Meta:'也只是普通的Python。
内部类是类实例之间共享数据的方便命名空间(因此,元数据名称为'元数据',但您可以将其称为任何您喜欢的名称)。虽然在Django中它通常是只读配置的东西,没有什么可以阻止你改变它:
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
属性,该属性是在创建模型时由模型Options
创建的metaclass
对象。在这里你可以找到所有Django类的'meta'信息。在Django中,Meta
仅用于将信息传递到创建_meta
Options
对象的过程中。
Django的Model
类专门处理一个名为Meta
的属性,它是一个类。这不是一般的Python事情。
Python元类是完全不同的。
声称Django模型的Meta
和元类是“完全不同”的答案是误导性的答案。
Django模型类对象的构造(也就是代表类定义本身的对象;是的,类也是对象)确实由名为ModelBase
的元类控制,你可以在这里看到代码:
https://github.com/django/django/blob/master/django/db/models/base.py#L61
ModelBase
所做的一件事就是在每个Django模型上创建_meta
属性,其中包含验证机制,字段详细信息,保存机器等等。并且,在此操作期间,在该过程中读取并使用模型内部Meta
类中指定的任何内容。
所以,虽然是,但在某种意义上,Meta
和元类是不同的“事物”,在Django模型构建的机制中它们是密切相关的;了解它们如何协同工作将加深您对两者的洞察力。
这可能是一个有用的信息来源,可以更好地理解Django模型如何使用元类。
https://code.djangoproject.com/wiki/DevModelCreation
如果您想要更好地了解对象的工作方式,这也可能有所帮助。
内部元类文档django模型元数据的文档是“任何不是字段的”,例如排序选项(排序),数据库表名(db_table)或人类可读的单数和复数名(verbose_name和verbose_name_plural)。不需要,并且将类Meta添加到模型是完全可选的。 https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options