# Documentation Django 5.2.8

# L’API `_meta` des modèles

class Options

L’API `_meta` des modèles est au cœur de l’ORM de Django. Elle permet à d’autres parties du système telles que les recherches, les requêtes, les formulaires et le site d’administration de comprendre les capacités de chaque modèle. L’API est accessible au travers de l’attribut `_meta` de chaque classe de modèle, qui est une instance d’objet `django.db.models.options.Options`.

Les méthodes et les attributs qu’elle fournit peuvent être utilisés pour :

- Récupérer toutes les instances de champ d’un modèle

- Récupérer une instance de champ unique d’un modèle par son nom

- Récupérer tous les champs composant la clé primaire d’un modèle

## API d’accès aux champs

### Récupération d’une instance de champ unique d’un modèle par son nom

Options.get_field(field_name)

  Renvoie une instance de champ correspondant au nom indiqué.

  `field_name` peut être le nom d’un champ du modèle, d’un champ d’un modèle abstrait ou hérité, ou d’un champ défini sur un autre modèle pointant vers ce modèle. Dans ce dernier cas, `field_name` est (par ordre de préférence) le nom `related_query_name` défini par l’utilisateur, le nom `related_name` défini par l’utilisateur ou le nom généré automatiquement par Django.

  Les `champs cachés` ne peuvent pas être récupérés par leur nom.

  Si aucun champ du nom indiqué n’a été trouvé, une exception `FieldDoesNotExist` est générée.

      >>> from django.contrib.auth.models import User

      # A field on the model
      >>> User._meta.get_field("username")
      <django.db.models.fields.CharField: username>

      # A field from another model that has a relation with the current model
      >>> User._meta.get_field("logentry")
      <ManyToOneRel: admin.logentry>

      # A non existent field
      >>> User._meta.get_field("does_not_exist")
      Traceback (most recent call last):
          ...
      FieldDoesNotExist: User has no field named 'does_not_exist'

### Récupération de toutes les instances de champ d’un modèle

Options.get_fields(include_parents=True, include_hidden=False)

  Renvoie un tuple de champs associés à un modèle. `get_fields()` accepte deux paramètres pouvant être utilisés pour contrôler quels champs sont renvoyés :

  `include_parents`

    `True` par défaut. Inclut récursivement les champs définis dans les classes parentes. Lorsque ce paramètre est défini à `False`, `get_fields()` ne renvoie que les champs déclarés directement sur le modèle concerné. Les champs de modèles qui héritent directement de modèles abstraits ou de classes mandataires sont considérés comme locaux, et non pas définis sur le parent.

  `include_hidden`

    `False` par défaut. Si défini à `True`, `get_fields()` inclura `les champs masqués`.

      >>> from django.contrib.auth.models import User
      >>> User._meta.get_fields()
      (<ManyToOneRel: admin.logentry>,
       <django.db.models.fields.AutoField: id>,
       <django.db.models.fields.CharField: password>,
       <django.db.models.fields.DateTimeField: last_login>,
       <django.db.models.fields.BooleanField: is_superuser>,
       <django.db.models.fields.CharField: username>,
       <django.db.models.fields.CharField: first_name>,
       <django.db.models.fields.CharField: last_name>,
       <django.db.models.fields.EmailField: email>,
       <django.db.models.fields.BooleanField: is_staff>,
       <django.db.models.fields.BooleanField: is_active>,
       <django.db.models.fields.DateTimeField: date_joined>,
       <django.db.models.fields.related.ManyToManyField: groups>,
       <django.db.models.fields.related.ManyToManyField: user_permissions>)

      # Also include hidden fields.
      >>> User._meta.get_fields(include_hidden=True)
      (<ManyToOneRel: auth.user_groups>,
       <ManyToOneRel: auth.user_user_permissions>,
       <ManyToOneRel: admin.logentry>,
       <django.db.models.fields.AutoField: id>,
       <django.db.models.fields.CharField: password>,
       <django.db.models.fields.DateTimeField: last_login>,
       <django.db.models.fields.BooleanField: is_superuser>,
       <django.db.models.fields.CharField: username>,
       <django.db.models.fields.CharField: first_name>,
       <django.db.models.fields.CharField: last_name>,
       <django.db.models.fields.EmailField: email>,
       <django.db.models.fields.BooleanField: is_staff>,
       <django.db.models.fields.BooleanField: is_active>,
       <django.db.models.fields.DateTimeField: date_joined>,
       <django.db.models.fields.related.ManyToManyField: groups>,
       <django.db.models.fields.related.ManyToManyField: user_permissions>)

### Récupérer les champs composant la clé primaire d’un modèle

New in Django 5.2.

Options.pk_fields

  Renvoie une liste des champs composant la clé primaire d’un modèle.

  Lorsqu’une `clé primaire composite` est définie dans un modèle, elle contiendra tous les `champs` auxquels elle fait référence.

      from django.db import models

      class TenantUser(models.Model):
          pk = models.CompositePrimaryKey("tenant_id", "id")
          tenant_id = models.IntegerField()
          id = models.IntegerField()

      >>> TenantUser._meta.pk_fields
      [
          <django.db.models.fields.IntegerField: tenant_id>,
          <django.db.models.fields.IntegerField: id>
      ]

  Sinon, elle contiendra le seul champ déclaré comme `clé primaire` du modèle.

      >>> User._meta.pk_fields
      [<django.db.models.fields.AutoField: id>]