Référence des contraintes

Les classes définies dans ce module créent des contraintes de base de données. Elles sont ajoutées dans l’option Meta.constraints des modèles.

Référencement des contraintes intégrées

Les contraintes sont définies dans django.db.models.constraints, mais par commodité elles sont importées dans django.db.models. La convention standard est d’utiliser from django.db import models et de se référer aux contraintes avec models.<Telle>Constraint.

Contraintes dans les classes de base abstraites

Les contraintes doivent toujours être nommées de façon unique. Cela signifie qu’il n’est pas possible de définir des contraintes dans une classe de base abstraite, dans la mesure où l’option Meta.constraints est héritée par les sous-classes avec exactement les mêmes valeurs d’attributs (y compris name). Pour éviter des collisions de nom, le nom peut contenir '%(app_label)s' et '%(class)s' qui seront remplacés respectivement par l’étiquette de l’application et le nom de la classe du modèle concret (tout en minuscules). Par exemple, CheckConstraint(check=Q(age__gte=18), name='%(app_label)s_%(class)s_is_adult').

Validation des contraintes

En général, les contraintes ne sont pas vérifiées lors de full_clean() et ne produisent donc pas d’erreurs ValidationError. Par contre, vous obtiendrez une erreur d’intégrité de base de données lors de l’enregistrement save(). Les contraintes UniqueConstraint sans condition (c’est-à-dire les contraintes d’unicité non partielles) et sans expressions (les contraintes d’unicité non fonctionnelles) sont différentes à cet égard dans le sens où elles font appel à la logique existante validate_unique() et recourent donc à la validation en deux étapes. En plus de l’erreur IntegrityError au moment du save(), des erreurs ValidationError sont aussi produites lors de la validation du modèle si la contrainte UniqueConstraint n’est pas respectée.

CheckConstraint

class CheckConstraint(*, check, name)

Crée une contrainte de vérification dans la base de données.

check

CheckConstraint.check

Un objet Q ou une Expression booléenne qui indique le contrôle que la contrainte souhaitée doit appliquer.

Par exemple, CheckConstraint(check=Q(age__gte=18), name='age_gte_18') s’assure que le champ age n’est jamais au-dessous de 18.

name

CheckConstraint.name

Le nom de la contrainte. La contrainte doit toujours posséder un nom unique.

UniqueConstraint

class UniqueConstraint(*expressions, fields=(), name=None, condition=None, deferrable=None, include=None, opclasses=())

Crée une contrainte d’unicité dans la base de données.

expressions

UniqueConstraint.expressions
New in Django 4.0.

L’argument positionnel *expressions permet de créer des contraintes d’unicité fonctionnelles sur des expressions et des fonctions de base de données.

Par exemple :

UniqueConstraint(Lower('name').desc(), 'category', name='unique_lower_name_category')

crée une contrainte d’unicité sur la valeur en minuscules du champ name dans l’ordre alphabétique inverse et le champ category dans l’ordre alphabétique par défaut.

Les contraintes d’unicité basées sur des fonctions sont soumises aux même restrictions de base de données que Index.expressions.

fields

UniqueConstraint.fields

Une liste de noms de champs qui précise l’ensemble unique de colonnes pour lesquelles la contrainte va assurer l’unicité.

Par exemple, UniqueConstraint(fields=['chambre', 'date'], name='reservation_unique') s’assure que chaque chambre ne peut être réservée qu’une seule fois par date.

name

UniqueConstraint.name

Le nom de la contrainte. La contrainte doit toujours posséder un nom unique.

condition

UniqueConstraint.condition

Un objet Q qui indique la condition que la contrainte souhaitée doit appliquer.

Par exemple :

UniqueConstraint(fields=['user'], condition=Q(status='DRAFT'), name='unique_draft_user')

s’assure que chaque utilisateur dispose d’un seul brouillon.

Ces conditions sont soumises aux même restrictions de base de données que Index.condition.

deferrable

UniqueConstraint.deferrable

Définissez ce paramètre pour créer une contrainte d’unicité différable. Les valeurs acceptées sont Deferrable.DEFERRED ou Deferrable.IMMEDIATE. Par exemple

from django.db.models import Deferrable, UniqueConstraint

UniqueConstraint(
    name='unique_order',
    fields=['order'],
    deferrable=Deferrable.DEFERRED,
)

Par défaut, les contraintes ne sont pas différées. Une contrainte différée ne sera pas appliquée avant la fin de la transaction. Une contrainte immédiate sera appliquée immédiatement après chaque commande.

MySQL, MariaDB et SQLite.

Les contraintes d’unicité différables sont ignorées avec MySQL, MariaDB et SQLite car ces moteurs ne les prennent pas en charge.

Avertissement

Les contraintes d’unicité différées peuvent amener à des performances réduites.

include

UniqueConstraint.include
New in Django 3.2.

Une liste ou un tuple de noms de champs à inclure dans l’index unique couvrant, représentant des colonnes qui ne sont pas des clés. Cela permet des analyses en index pur avec des requêtes qui ne sélectionnent que les champs inclus (include) et qui ne filtrent que sur les champs indexés (fields).

Par exemple :

UniqueConstraint(name='unique_booking', fields=['room', 'date'], include=['full_name'])

permettra le filtrage sur room et date, sélectionnant aussi full_name, tout en ne récupérant les données qu’à partir de l’index.

include n’est pris en charge que par PostgreSQL.

Les colonnes qui ne sont pas des clés sont soumises aux même restrictions de base de données que pour Index.include.

opclasses

UniqueConstraint.opclasses
New in Django 3.2.

Les noms des classes d’opérateurs PostgreSQL à utiliser pour cet index unique. Si vous nécessitez une classe d’opérateur personnalisée, vous devez en fournir une pour chaque champ de l’index.

Par exemple :

UniqueConstraint(name='unique_username', fields=['username'], opclasses=['varchar_pattern_ops'])

crée un index unique sur username en utilisant varchar_pattern_ops.

opclasses est ignoré pour les bases de données autres que PostgreSQL.

Back to Top