Comment fonctionne la classe Meta de Django?
J'utilise Django qui permet aux gens d'ajouter des paramètres supplémentaires à une classe en utilisant class Meta
.
class FooModel(models.Model):
...
class Meta:
...
la seule chose que j'ai trouvée dans la documentation de Python était:
class FooMetaClass(type):
...
class FooClass:
__metaclass__ = FooMetaClass
cependant, je ne pense pas que ce soit la même chose.
4 réponses
vous posez une question sur deux choses différentes:
-
Meta
classe intérieure dans les modèles Django :c'est juste un conteneur de classe avec quelques options (métadonnées) attachées au modèle. Il définit des choses telles que les permissions disponibles, Le nom de table de base de données associée, si le modèle est abstrait ou non, les versions singulières et plurielles du nom etc.
Short l'explication est ici: Django docs: Modèles: Méta options
Liste des méta-options est ici: Django docs: Modèle de Méta options
-
Métaclasse en Python :
la meilleure description est ici: Qu'est-ce qu'un metaclass en Python?
S'étendant sur la réponse de Django de Tadeck ci-dessus, l'utilisation de 'class Meta:' dans Django est juste Python normal aussi.
la classe interne est un namespace pratique pour les données partagées entre les instances de classe (d'où le nom Meta pour 'metadata' mais vous pouvez l'appeler comme vous voulez). Alors qu'à Django, c'est généralement une configuration en lecture seule, il n'y a rien qui vous empêche de la changer:
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
vous pouvez l'explorer à Django directement aussi e.g:
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>}
cependant, à Django vous êtes plus susceptibles de vouloir explorer l'attribut _meta
qui est un objet Options
créé par le modèle metaclass
quand un modèle est créé. C'est là que vous trouverez toutes les informations de la classe Django "meta". Dans Django, Meta
est simplement utilisé pour transmettre des informations dans le processus de création de l'objet _meta
Options
.
Django Model
classe spécifiquement poignées avoir un attribut nommé Meta
qui est une classe. Ce n'est pas un truc général en Python.
Python sont complètement différentes.
les réponses qui prétendent que le modèle de Django Meta
et les métaclasses sont" complètement différentes " sont des réponses trompeuses.
la construction du modèle Django les objets de classe (c'est-à-dire l'objet qui représente la définition de classe elle-même; oui, les classes sont aussi des objets) sont en effet contrôlés par une métaclasse appelée ModelBase
, vous pouvez voir ce code ici:
https://github.com/django/django/blob/master/django/db/models/base.py#L61
et l'une des choses que ModelBase
fait est de créer l'attribut _meta
sur chaque modèle Django qui contient des machines de validation, des détails de champ, des machines d'économie et ainsi de suite. Et, pendant cette opération, tout ce qui est spécifié dans la classe intérieure Meta
du modèle est lu et utilisé dans ce processus.
donc, tandis que oui, dans un sens Meta
et les métaclasses sont des "choses" différentes, au sein de la mécanique de la construction modèle Django, elles sont intimement liées; comprendre comment elles fonctionnent ensemble vous permettra d'approfondir votre compréhension des deux à la fois.
cela pourrait être une source utile d'information pour mieux comprendre comment les modèles Django utilisent des métaclasses.
https://code.djangoproject.com/wiki/DevModelCreation
et cela pourrait aidez aussi si vous voulez mieux comprendre comment les objets fonctionnent en général.