Aller au contenu

Métamodèle

Le métamodèle est, par définition, le modèle du modèle : il permet de décrire plus finement le comportement d’une classe de données, par un ensemble d’attributs :

Les propriétés de la classe Meta les plus utiles sont les suivantes:

DomainePropriétéDescription
TriorderingSpécifie un ordre de récupération par défaut
order_with_respect_tohttps://docs.djangoproject.com/fr/stable/ref/models/options/#order-with-respect-to
get_latest_by
Représentationverbose_namepour indiquer le nom à utiliser au singulier pour définir votre classe
verbose_name_pluralpour la forme plurielle
Persistance de donnéescontraints(Voir ici)
Indices

Ordre par défaut

La propriété ordering que l’on peut trouver au niveau du métamodèle permet de définir l’ordre par défaut dans lequel vous récupérerez vos éléments. Par défaut, ceux-ci sont triés sur la clé primaire pk. Ainsi, le code Book.objects.all() que nous avons utilisé précédemment nous renvoie une liste proprement triée en fonction des identifiants assignés. Il est cependant possible de définir un ordre différent, qui s’appliquera sur toutes les requêtes programmées.

library/models.py
class Book(models.Model):
name = models.CharField(max_length=255)
[...]
class Meta:
ordering = ('title',) <1>

<1> La propriété ordering est un tuple ou une liste. Si vous utilisez un tuple (cela prend moins de place en mémoire), n’oubliez pas la virgule !

La définition d’un ordre par défaut au niveau du modèle ne signifie pas qu’il ne sera pas possible de modifier cet ordre (la méthode order_by existe et peut être chaînée à n’importe quel queryset).

Il est donc nécessaire de tester ce type de comportement dans son ensemble, dans la mesure où un .first() dans votre code (l’équivalent du TOP 1 en SQL) pourrait être modifié simplement par cette petite information.

Représentations textuelles

Contraintes

Les contraintes sont de plusieurs types :

  • Unicité
  • Composée
constraints = [ # constraints added
models.CheckConstraint(
check=models.Q(year_born__lte=datetime.datetoday().year-18),
name='will_be_of_age'
),
]