{"title":"Référence des contraintes","version":"3.1","locale":"fr","docname":"ref/models/constraints","url":"/fr/3.1/ref/models/constraints/","canonical":"https://djangodocs.dev/fr/3.1/ref/models/constraints/","summary":"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…","html":"<span id=\"constraints-reference\"></span><h1>Référence des contraintes<a class=\"heading-anchor\" href=\"#module-django.db.models.constraints\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Les classes définies dans ce module créent des contraintes de base de données. Elles sont ajoutées dans l’option <a class=\"reference internal\" href=\"/fr/3.1/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.constraints</span></code></a> des modèles.</p>\n<aside class=\"admonition-referencing-built-in-constraints admonition\">\n<p class=\"admonition-title\">Référencement des contraintes intégrées</p>\n<p>Les contraintes sont définies dans <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.models.constraints</span></code>, mais par commodité elles sont importées dans <a class=\"reference internal\" href=\"/fr/3.1/topics/db/models/#module-django.db.models\" title=\"django.db.models\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.db.models</span></code></a>. La convention standard est d’utiliser <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">django.db</span> <span class=\"pre\">import</span> <span class=\"pre\">models</span></code> et de se référer aux contraintes avec <code class=\"docutils literal notranslate\"><span class=\"pre\">models.&lt;Telle&gt;Constraint</span></code>.</p>\n</aside>\n<aside class=\"admonition-constraints-in-abstract-base-classes admonition\">\n<p class=\"admonition-title\">Contraintes dans les classes de base abstraites</p>\n<p>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 <a class=\"reference internal\" href=\"/fr/3.1/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.constraints</span></code></a> est héritée par les sous-classes avec exactement les mêmes valeurs d’attributs (y compris <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code>). Pour éviter des collisions de nom, le nom peut contenir <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(app_label)s'</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(class)s'</span></code> 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, <code class=\"docutils literal notranslate\"><span class=\"pre\">CheckConstraint(check=Q(age__gte=18),</span> <span class=\"pre\">name='%(app_label)s_%(class)s_is_adult')</span></code>.</p>\n</aside>\n<aside class=\"admonition-validation-of-constraints admonition\">\n<p class=\"admonition-title\">Validation des contraintes</p>\n<p>En général, les contraintes ne sont <strong>pas</strong> vérifiées lors de <code class=\"docutils literal notranslate\"><span class=\"pre\">full_clean()</span></code> et ne produisent donc pas d’erreurs <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code>. Par contre, vous obtiendrez une erreur d’intégrité de base de données lors de l’enregistrement <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code>. Les contraintes <code class=\"docutils literal notranslate\"><span class=\"pre\">UniqueConstraint</span></code> sans <a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint.condition\" title=\"django.db.models.UniqueConstraint.condition\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">condition</span></code></a> (c’est-à-dire les contraintes d’unicité non partielles) sont différentes à cet égard dans le sens où elles font appel à la logique existante <code class=\"docutils literal notranslate\"><span class=\"pre\">validate_unique()</span></code> et recourent donc à la validation en deux étapes. En plus de l’erreur <code class=\"docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></code> au moment du <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code>, des erreurs <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> sont aussi produites lors de la validation du modèle si la contrainte <code class=\"docutils literal notranslate\"><span class=\"pre\">UniqueConstraint</span></code> n’est pas respectée.</p>\n</aside>\n<section id=\"checkconstraint\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">CheckConstraint</span></code><a class=\"heading-anchor\" href=\"#checkconstraint\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.CheckConstraint\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">CheckConstraint</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">check</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.CheckConstraint\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Crée une contrainte de vérification dans la base de données.</p>\n</dd></dl>\n\n<section id=\"check\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">check</span></code><a class=\"heading-anchor\" href=\"#check\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.CheckConstraint.check\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">CheckConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">check</span></span><a class=\"heading-anchor\" href=\"#django.db.models.CheckConstraint.check\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Un objet <a class=\"reference internal\" href=\"/fr/3.1/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Q</span></code></a> ou une <a class=\"reference internal\" href=\"/fr/3.1/ref/models/expressions/#django.db.models.Expression\" title=\"django.db.models.Expression\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Expression</span></code></a> booléenne qui indique le contrôle que la contrainte souhaitée doit appliquer.</p>\n<p>Par exemple, <code class=\"docutils literal notranslate\"><span class=\"pre\">CheckConstraint(check=Q(age__gte=18),</span> <span class=\"pre\">name='age_gte_18')</span></code> s’assure que le champ age n’est jamais au-dessous de 18.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.1\">\n<p class=\"version-note-title\">Changed in Django 3.1</p><p>La prise en charge des <a class=\"reference internal\" href=\"/fr/3.1/ref/models/expressions/#django.db.models.Expression\" title=\"django.db.models.Expression\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Expression</span></code></a> booléennes a été ajoutée.</p>\n</aside>\n</section>\n<section id=\"name\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code><a class=\"heading-anchor\" href=\"#name\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.CheckConstraint.name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">CheckConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.CheckConstraint.name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Le nom de la contrainte. La contrainte doit toujours posséder un nom unique.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.0\">\n<p class=\"version-note-title\">Changed in Django 3.0</p><p>L’interpolation des variables <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(app_label)s'</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(class)s'</span></code> a été ajoutée.</p>\n</aside>\n</section>\n</section>\n<section id=\"uniqueconstraint\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">UniqueConstraint</span></code><a class=\"heading-anchor\" href=\"#uniqueconstraint\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.UniqueConstraint\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">UniqueConstraint</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\"><span class=\"pre\">*</span></abbr></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fields</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">condition</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">deferrable</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Crée une contrainte d’unicité dans la base de données.</p>\n</dd></dl>\n\n<section id=\"fields\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">fields</span></code><a class=\"heading-anchor\" href=\"#fields\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.UniqueConstraint.fields\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UniqueConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">fields</span></span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.fields\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Une liste de noms de champs qui précise l’ensemble unique de colonnes pour lesquelles la contrainte va assurer l’unicité.</p>\n<p>Par exemple, <code class=\"docutils literal notranslate\"><span class=\"pre\">UniqueConstraint(fields=['chambre',</span> <span class=\"pre\">'date'],</span> <span class=\"pre\">name='reservation_unique')</span></code> s’assure que chaque chambre ne peut être réservée qu’une seule fois par date.</p>\n</section>\n<section id=\"id1\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code><a class=\"heading-anchor\" href=\"#id1\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.UniqueConstraint.name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UniqueConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">name</span></span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.name\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Le nom de la contrainte. La contrainte doit toujours posséder un nom unique.</p>\n<aside class=\"version-note version-changed\" data-version=\"3.0\">\n<p class=\"version-note-title\">Changed in Django 3.0</p><p>L’interpolation des variables <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(app_label)s'</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">'%(class)s'</span></code> a été ajoutée.</p>\n</aside>\n</section>\n<section id=\"condition\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code><a class=\"heading-anchor\" href=\"#condition\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.UniqueConstraint.condition\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UniqueConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">condition</span></span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.condition\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Un objet <a class=\"reference internal\" href=\"/fr/3.1/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Q</span></code></a> qui indique la condition que la contrainte souhaitée doit appliquer.</p>\n<p>Par exemple :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">UniqueConstraint</span><span class=\"p\">(</span><span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;user&#39;</span><span class=\"p\">],</span> <span class=\"n\">condition</span><span class=\"o\">=</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">status</span><span class=\"o\">=</span><span class=\"s1\">&#39;DRAFT&#39;</span><span class=\"p\">),</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;unique_draft_user&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>s’assure que chaque utilisateur dispose d’un seul brouillon.</p>\n<p>Ces conditions sont soumises aux même restrictions de base de données que <a class=\"reference internal\" href=\"/fr/3.1/ref/models/indexes/#django.db.models.Index.condition\" title=\"django.db.models.Index.condition\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Index.condition</span></code></a>.</p>\n</section>\n<section id=\"deferrable\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">deferrable</span></code><a class=\"heading-anchor\" href=\"#deferrable\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.UniqueConstraint.deferrable\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UniqueConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">deferrable</span></span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.deferrable\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<aside class=\"version-note version-added\" data-version=\"3.1\">\n<p class=\"version-note-title\">New in Django 3.1</p></aside>\n<p>Définissez ce paramètre pour créer une contrainte d’unicité différable. Les valeurs acceptées sont <code class=\"docutils literal notranslate\"><span class=\"pre\">Deferrable.DEFERRED</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">Deferrable.IMMEDIATE</span></code>. Par exemple</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Deferrable</span><span class=\"p\">,</span> <span class=\"n\">UniqueConstraint</span>\n\n<span class=\"n\">UniqueConstraint</span><span class=\"p\">(</span>\n    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;unique_order&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;order&#39;</span><span class=\"p\">],</span>\n    <span class=\"n\">deferrable</span><span class=\"o\">=</span><span class=\"n\">Deferrable</span><span class=\"o\">.</span><span class=\"n\">DEFERRED</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>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.</p>\n<aside class=\"admonition-mysql-mariadb-and-sqlite admonition\">\n<p class=\"admonition-title\">MySQL, MariaDB et SQLite.</p>\n<p>Les contraintes d’unicité différables sont ignorées avec MySQL, MariaDB et SQLite car ces moteurs ne les prennent pas en charge.</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Les contraintes d’unicité différées peuvent amener à des <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/sql-createtable.html#id-1.9.3.85.9.4\">performances réduites</a>.</p>\n</aside>\n</section>\n</section>","rootId":"module-django.db.models.constraints","toc":[{"title":"CheckConstraint","anchor":"checkconstraint","children":[{"title":"check","anchor":"check","children":[]},{"title":"name","anchor":"name","children":[]}]},{"title":"UniqueConstraint","anchor":"uniqueconstraint","children":[{"title":"fields","anchor":"fields","children":[]},{"title":"name","anchor":"id1","children":[]},{"title":"condition","anchor":"condition","children":[]},{"title":"deferrable","anchor":"deferrable","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/3.1/ref/"},{"docname":"ref/models/index","title":"Modèles","url":"/fr/3.1/ref/models/"}],"prev":{"docname":"ref/models/indexes","title":"Référence des index de modèle","url":"/fr/3.1/ref/models/indexes/"},"next":{"docname":"ref/models/meta","title":"L’API _meta des modèles","url":"/fr/3.1/ref/models/meta/"},"formats":{"html":"/fr/3.1/ref/models/constraints/","markdown":"/fr/3.1/ref/models/constraints.md","json":"/fr/3.1/ref/models/constraints.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/ref/models/constraints.txt","official":"https://docs.djangoproject.com/fr/3.1/ref/models/constraints/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}