242

我正在使用 Django,它允许人们使用class Meta.

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

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

class FooMetaClass(type):
    ...

class FooClass:
    __metaclass__ = FooMetaClass

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

4

7 回答 7

295

你在问一个关于两个不同事情的问题:

  1. MetaDjango 模型中的内部类

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

    简短的解释在这里:Django docs: Models: Meta options

    可用元选项列表在这里:Django docs: Model Meta options

    对于最新版本的 Django:Django 文档:模型元选项

  2. Python中的元类

    最好的描述在这里:什么是 Python 中的元类?

于 2012-04-27T03:04:44.903 回答
64

扩展上面 Tadeck 的 Django 答案,在 Django 中使用 'class Meta:' 也只是普通的 Python。

内部类是类实例之间共享数据的方便命名空间(因此“元数据”的名称为 Meta,但您可以随意称呼它)。虽然在 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 类的“元”信息。在 Django 中,Meta只是用于将信息传递到创建_meta Options对象的过程中。

于 2013-08-08T04:23:23.027 回答
26

Django 的Model类专门处理具有名为的属性Meta,它是一个类。这不是一般的 Python 事物。

Python 元类完全不同。

于 2012-04-27T03:02:43.320 回答
14

声称 Django 模型Meta和元类“完全不同”的答案是误导性的答案。

django模型类对象的构造,也就是说代表类定义本身的对象(是的,类也是对象),确实是由一个叫做的元类控制的ModelBase,你可以在这里看到代码

其中一件事ModelBase是在每个 Django 模型上创建_meta属性,其中包含验证机制、字段详细信息、保存逻辑等。在此操作期间,模型内部Meta类中指定的内容在该过程中被读取和使用。

所以,虽然是的,从某种意义上说Meta,元类是不同的“东西”,但在 Django 模型构建的机制中,它们是密切相关的;了解它们如何协同工作将同时加深您对两者的洞察力。

这可能是一个有用的信息来源,可以更好地理解 Django 模型如何使用元类。

https://code.djangoproject.com/wiki/DevModelCreation

如果您想更好地了解对象的一般工作方式,这也可能会有所帮助。

https://docs.python.org/3/reference/datamodel.html

于 2017-12-15T18:40:30.970 回答
3

内部元类文档:

这个django 模型元数据文档是“任何不是字段的东西”,例如排序选项(ordering), database table name (db_table), or human-readable singular and plural names (verbose_name and verbose_name_plural)。不需要,将 Meta 类添加到模型是完全可选的。 https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options

于 2019-03-11T10:53:41.607 回答
1

在 Django 中,它充当配置类并将配置数据保存在一个地方!

于 2020-05-21T16:55:13.340 回答
1

Meta是代码逻辑中model.fieldsform.widgets相遇的地方。因此,在 Class Meta() 下,您可以在模型字段和您希望在表单中拥有的不同小部件之间创建链接。

于 2020-10-04T22:26:15.037 回答