Django的Meta课程是如何工作的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (73)

我使用Django,它允许用户通过以下方式向类添加额外的参数class Meta...

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

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

class FooMetaClass(type):
    ...

class FooClass:
    __metaclass__ = FooMetaClass

然而,我不认为这是一回事。

提问于
用户回答回答于

你问的问题有两件事:

  1. MetaDjango模型的内部类* 这只是一个类容器,带有一些选项(元数据)附加到模型中。它定义了可用权限、关联数据库表名、模型是否抽象、名称的单数和复数版本等。 以下是简短的解释:Django文档:模型:元选项可用的元选项列表如下:Django文档:模型元选项
  2. Python中的元类
用户回答回答于

扩展到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属性,它是在创建模型时由模型元类创建的选项对象。在那里可以找到所有Django类的“meta”信息。在Django中,Meta仅用于将信息传递到创建_元选项对象。

扫码关注云+社区