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:
Domaine | Propriété | Description |
---|---|---|
Tri | ordering | Spécifie un ordre de récupération par défaut |
order_with_respect_to | https://docs.djangoproject.com/fr/stable/ref/models/options/#order-with-respect-to | |
get_latest_by | ||
Représentation | verbose_name | pour indiquer le nom à utiliser au singulier pour définir votre classe |
verbose_name_plural | pour la forme plurielle | |
Persistance de données | contraints | (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.
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' ),]