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.

135
demandé sur Honest Abe 2012-04-27 06:59:00

4 réponses

vous posez une question sur deux choses différentes:

  1. 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

  2. Métaclasse en Python :

    la meilleure description est ici: Qu'est-ce qu'un metaclass en Python?

166
répondu Tadeck 2017-05-23 11:47:28

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 .

40
répondu Paul Whipp 2018-05-07 23:21:24

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.

Les métaclasses

Python sont complètement différentes.

19
répondu Amber 2012-04-27 03:02:43

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.

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

3
répondu jhrr 2018-04-23 13:23:04