Django的Meta类如何工作?

时间:2012-04-27 02:59:00

标签: python django metaclass

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

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

我在Python的文档中找到的唯一内容是:

class FooMetaClass(type):
    ...

class FooClass:
    __metaclass__ = FooMetaClass

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

7 个答案:

答案 0 :(得分:189)

您在问两个不同的问题:

    Django模型中
  1. Meta内部类

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

    简短说明如下:Django docs: Models: Meta options

    可用元选项列表位于:Django docs: Model Meta options

  2. Python中的元类

    最佳描述如下:What is a metaclass in Python?

答案 1 :(得分:44)

在上面的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类的'meta'信息。在Django中,Meta仅用于将信息传递到创建_meta Options对象的过程中。

答案 2 :(得分:19)

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

Python元类完全不同。

答案 3 :(得分:3)

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

构建Django模型类对象(也就是代表类定义本身的对象;是的,类也是对象)确实由名为{{1}的元类控制你可以在这里看到代码:

https://github.com/django/django/blob/master/django/db/models/base.py#L61

ModelBase所做的一件事就是在每个Django模型上创建ModelBase属性,其中包含验证机制,字段详细信息,保存机器等等。并且,在此操作期间,将在该过程中读取并使用模型内部_meta类中指定的任何内容。

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

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

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

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

内部元类文档 django的这份文件 模型元数据是“任何不是字段的东西”,例如排序选项(排序),数据库表名称(db_table)或人类可读的单复数名称(verbose_name和verbose_name_plural)。不需要任何操作,并且将Meta类添加到模型是完全可选的。 https://docs.djangoproject.com/en/dev/topics/db/models/#meta-options

答案 6 :(得分:0)

是代码逻辑中 model.fields MEET > form.widgets 。 因此,在Class Meta()下,您可以在模型的字段与表单中要包含的不同小部件之间创建链接。