{"title":"Référence des contraintes","version":"4.0","locale":"fr","docname":"ref/models/constraints","url":"/fr/4.0/ref/models/constraints/","canonical":"https://djangodocs.dev/fr/4.0/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/4.0/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/4.0/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/4.0/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) et sans <a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint.expressions\" title=\"django.db.models.UniqueConstraint.expressions\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">expressions</span></code></a> (les contraintes d’unicité non fonctionnelles) 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/4.0/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/4.0/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</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</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=\"o\"><span class=\"pre\">*</span></span><span class=\"n\"><span class=\"pre\">expressions</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">fields</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">()</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">name</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\">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>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">include</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\">opclasses</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">()</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=\"expressions\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">expressions</span></code><a class=\"heading-anchor\" href=\"#expressions\"><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.expressions\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UniqueConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">expressions</span></span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.expressions\"><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=\"4.0\">\n<p class=\"version-note-title\">New in Django 4.0</p></aside>\n<p>L’argument positionnel <code class=\"docutils literal notranslate\"><span class=\"pre\">*expressions</span></code> permet de créer des contraintes d’unicité fonctionnelles sur des expressions et des fonctions de base de données.</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\">Lower</span><span class=\"p\">(</span><span class=\"s1\">&#39;name&#39;</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">desc</span><span class=\"p\">(),</span> <span class=\"s1\">&#39;category&#39;</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;unique_lower_name_category&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>crée une contrainte d’unicité sur la valeur en minuscules du champ <code class=\"docutils literal notranslate\"><span class=\"pre\">name</span></code> dans l’ordre alphabétique inverse et le champ <code class=\"docutils literal notranslate\"><span class=\"pre\">category</span></code> dans l’ordre alphabétique par défaut.</p>\n<p>Les contraintes d’unicité basées sur des fonctions sont soumises aux même restrictions de base de données que <a class=\"reference internal\" href=\"/fr/4.0/ref/models/indexes/#django.db.models.Index.expressions\" title=\"django.db.models.Index.expressions\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Index.expressions</span></code></a>.</p>\n</section>\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</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/4.0/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/4.0/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<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 id=\"include\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">include</span></code><a class=\"heading-anchor\" href=\"#include\"><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.include\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UniqueConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">include</span></span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.include\"><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.2\">\n<p class=\"version-note-title\">New in Django 3.2</p></aside>\n<p>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 (<a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint.include\" title=\"django.db.models.UniqueConstraint.include\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">include</span></code></a>) et qui ne filtrent que sur les champs indexés (<a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint.fields\" title=\"django.db.models.UniqueConstraint.fields\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">fields</span></code></a>).</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\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;unique_booking&#39;</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;room&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;date&#39;</span><span class=\"p\">],</span> <span class=\"n\">include</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;full_name&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>permettra le filtrage sur <code class=\"docutils literal notranslate\"><span class=\"pre\">room</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">date</span></code>, sélectionnant aussi <code class=\"docutils literal notranslate\"><span class=\"pre\">full_name</span></code>, tout en ne récupérant les données qu’à partir de l’index.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">include</span></code> n’est pris en charge que par PostgreSQL.</p>\n<p>Les colonnes qui ne sont pas des clés sont soumises aux même restrictions de base de données que pour <a class=\"reference internal\" href=\"/fr/4.0/ref/models/indexes/#django.db.models.Index.include\" title=\"django.db.models.Index.include\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Index.include</span></code></a>.</p>\n</section>\n<section id=\"opclasses\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">opclasses</span></code><a class=\"heading-anchor\" href=\"#opclasses\"><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.opclasses\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UniqueConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">opclasses</span></span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.opclasses\"><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.2\">\n<p class=\"version-note-title\">New in Django 3.2</p></aside>\n<p>Les noms des <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/indexes-opclass.html\">classes d’opérateurs PostgreSQL</a> à 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.</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\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;unique_username&#39;</span><span class=\"p\">,</span> <span class=\"n\">fields</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;username&#39;</span><span class=\"p\">],</span> <span class=\"n\">opclasses</span><span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s1\">&#39;varchar_pattern_ops&#39;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>crée un index unique sur <code class=\"docutils literal notranslate\"><span class=\"pre\">username</span></code> en utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">varchar_pattern_ops</span></code>.</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">opclasses</span></code> est ignoré pour les bases de données autres que PostgreSQL.</p>\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":"expressions","anchor":"expressions","children":[]},{"title":"fields","anchor":"fields","children":[]},{"title":"name","anchor":"id1","children":[]},{"title":"condition","anchor":"condition","children":[]},{"title":"deferrable","anchor":"deferrable","children":[]},{"title":"include","anchor":"include","children":[]},{"title":"opclasses","anchor":"opclasses","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/4.0/ref/"},{"docname":"ref/models/index","title":"Modèles","url":"/fr/4.0/ref/models/"}],"prev":{"docname":"ref/models/indexes","title":"Référence des index de modèle","url":"/fr/4.0/ref/models/indexes/"},"next":{"docname":"ref/models/meta","title":"L’API _meta des modèles","url":"/fr/4.0/ref/models/meta/"},"formats":{"html":"/fr/4.0/ref/models/constraints/","markdown":"/fr/4.0/ref/models/constraints.md","json":"/fr/4.0/ref/models/constraints.json"},"source":"https://github.com/django/django/blob/stable/4.0.x/docs/ref/models/constraints.txt","official":"https://docs.djangoproject.com/fr/4.0/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","it","pt-br","ko","es","el","pl"]}