242

私はDjangoを使用しています.Djangoを使用すると、クラスに追加のパラメータを追加できますclass Meta.

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

Pythonのドキュメントで見つけた唯一のものは次のとおりです。

class FooMetaClass(type):
    ...

class FooClass:
    __metaclass__ = FooMetaClass

しかし、これは同じことではないと思います。

4

7 に答える 7

295

あなたは2つの異なることについて質問しています:

  1. MetaDjango モデルの内部クラス:

    これは、いくつかのオプション (メタデータ) がモデルに添付された単なるクラス コンテナーです。利用可能な権限、関連付けられたデータベース テーブル名、モデルが抽象的かどうか、名前の単数形と複数形などを定義します。

    簡単な説明はこちら: Django docs: Models: Meta options

    利用可能なメタ オプションのリストはこちら: Django docs: Model Meta options

    Django の最新バージョン: Django docs: Model Meta options

  2. Python のメタクラス:

    最良の説明は次のとおりです: What are metaclasses in 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である属性を調査する可能性が高くなります。Django クラスの「メタ」情報はすべてここにあります。Django では、オブジェクトを作成するプロセスに情報を渡すためにのみ使用されます。OptionsmetaclassMeta_meta Options

于 2013-08-08T04:23:23.027 に答える
26

Django のModelクラスは、クラスであるという名前の属性を持つことを具体的に処理しますMeta。これは一般的な Python のことではありません。

Python メタクラスは完全に異なります。

于 2012-04-27T03:02:43.320 に答える
1

クラスMetaは、コード ロジック内でmodel.fields がform.widgets出会う場所です。したがって、Class Meta() の下で、モデルのフィールドと、フォームに含めるさまざまなウィジェットとの間のリンクを作成します。

于 2020-10-04T22:26:15.037 に答える