---
title: "Référence des contraintes"
version: 2.2
locale: fr
source: https://docs.djangoproject.com/fr/2.2/ref/models/constraints/
canonical: https://djangodocs.dev/fr/2.2/ref/models/constraints/
---
# Référence des contraintes

> **New in Django 2.2**

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`](/fr/2.2/ref/models/options/#django.db.models.Options.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`](/fr/2.2/topics/db/models/#module-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`](/fr/2.2/ref/models/options/#django.db.models.Options.constraints) est héritée par les sous-classes avec exactement les mêmes valeurs d’attributs (y compris `name`). Il faut dès lors définir l’option `constraints` directement sur les sous-classes, ce qui permet d’indiquer un nom unique pour chaque contrainte.

> **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`](#django.db.models.UniqueConstraint.condition) (c’est-à-dire les contraintes d’unicité non partielles) 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(* (Keyword-only parameters separator (PEP 3102)), check, name)`

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

### `check`

#### `CheckConstraint.check`

Un objet [`Q`](/fr/2.2/ref/models/querysets/#django.db.models.Q) 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.

## `UniqueConstraint`

#### `class UniqueConstraint(* (Keyword-only parameters separator (PEP 3102)), fields, name, condition=None)`

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

### `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.

### `condition`

#### `UniqueConstraint.condition`

Un objet [`Q`](/fr/2.2/ref/models/querysets/#django.db.models.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`](/fr/2.2/ref/models/indexes/#django.db.models.Index.condition).
