{"title":"Référence des contraintes","version":"5.0","locale":"fr","docname":"ref/models/constraints","url":"/fr/5.0/ref/models/constraints/","canonical":"https://djangodocs.dev/fr/5.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.","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/5.0/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\">Meta.constraints</code></a> des modèles.</p>\n<aside class=\"admonition-referencing-built-in-constraints admonition\" role=\"note\">\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\">django.db.models.constraints</code>, mais par commodité elles sont importées dans <a class=\"reference internal\" href=\"/fr/5.0/topics/db/models/#module-django.db.models\" title=\"django.db.models\"><code class=\"xref py py-mod docutils literal notranslate\">django.db.models</code></a>. La convention standard est d’utiliser <code class=\"docutils literal notranslate\">from django.db import models</code> et de se référer aux contraintes avec <code class=\"docutils literal notranslate\">models.&lt;Telle&gt;Constraint</code>.</p>\n</aside>\n<aside class=\"admonition-constraints-in-abstract-base-classes admonition\" role=\"note\">\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/5.0/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\">Meta.constraints</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\">name</code>). Pour éviter des collisions de nom, le nom peut contenir <code class=\"docutils literal notranslate\">'%(app_label)s'</code> et <code class=\"docutils literal notranslate\">'%(class)s'</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\">CheckConstraint(check=Q(age__gte=18), name='%(app_label)s_%(class)s_is_adult')</code>.</p>\n</aside>\n<aside class=\"admonition-validation-of-constraints admonition\" role=\"note\">\n<p class=\"admonition-title\">Validation des contraintes</p>\n<p>Les contraintes sont vérifiées durant la <a class=\"reference internal\" href=\"/fr/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">validation des modèles</span></a>.</p>\n</aside>\n<aside class=\"admonition-validation-of-constraints-with-jsonfield admonition\" role=\"note\">\n<p class=\"admonition-title\">Validation des contraintes pour <code class=\"docutils literal notranslate\">JSONField</code></p>\n<p>Les contraintes contenant des champs <a class=\"reference internal\" href=\"/fr/5.0/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a> peuvent ne pas produire d’erreurs de validation car les transformations de clés, d’indices et de chemins présentent beaucoup de particularités en fonction du type de base de données. Ceci <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/34059\">pourrait être pris en charge à l’avenir</a>.</p>\n<p>Vous devriez toujours vérifier qu’il n’y a pas de messages de journal dans le journaliseur <code class=\"docutils literal notranslate\">django.db.models</code>, du genre <em>«Got a database error calling check() on …»</em> pour être sûr que la validation s’est bien déroulée.</p>\n</aside>\n<section id=\"baseconstraint\">\n<h2><code class=\"docutils literal notranslate\">BaseConstraint</code><a class=\"heading-anchor\" href=\"#baseconstraint\"><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.BaseConstraint\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">BaseConstraint</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>name</em>, <em class=\"sig-param\">violation_error_code<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">violation_error_message<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.BaseConstraint\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Classe de base pour toutes les contraintes. Les sous-classes doivent implémenter les méthodes <code class=\"docutils literal notranslate\">constraint_sql()</code>, <code class=\"docutils literal notranslate\">create_sql()</code>, <code class=\"docutils literal notranslate\">remove_sql()</code> et <code class=\"docutils literal notranslate\">validate()</code>.</p>\n<aside class=\"version-note version-deprecated\" data-version=\"5.0\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 5.0</p><p><span class=\"versionmodified deprecated\">Obsolète depuis la version 5.0: </span>La prise en charge de la transmission d’arguments positionnels est obsolète.</p>\n</aside>\n</dd></dl>\n\n<p>Toutes les contraintes partagent les paramètres suivants :</p>\n<section id=\"name\">\n<h3><code class=\"docutils literal notranslate\">name</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.BaseConstraint.name\">\n<span class=\"sig-prename descclassname\">BaseConstraint.</span><span class=\"sig-name descname\">name</span><a class=\"heading-anchor\" href=\"#django.db.models.BaseConstraint.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=\"violation-error-code\">\n<h3><code class=\"docutils literal notranslate\">violation_error_code</code><a class=\"heading-anchor\" href=\"#violation-error-code\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"5.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.0</p></aside>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.BaseConstraint.violation_error_code\">\n<span class=\"sig-prename descclassname\">BaseConstraint.</span><span class=\"sig-name descname\">violation_error_code</span><a class=\"heading-anchor\" href=\"#django.db.models.BaseConstraint.violation_error_code\"><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 code d’erreur utilisé lorsque <code class=\"docutils literal notranslate\">ValidationError</code> est générée pendant la <a class=\"reference internal\" href=\"/fr/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">phase de validation des modèles</span></a>. Contient <code class=\"docutils literal notranslate\">None</code> par défaut.</p>\n</section>\n<section id=\"violation-error-message\">\n<h3><code class=\"docutils literal notranslate\">violation_error_message</code><a class=\"heading-anchor\" href=\"#violation-error-message\"><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.BaseConstraint.violation_error_message\">\n<span class=\"sig-prename descclassname\">BaseConstraint.</span><span class=\"sig-name descname\">violation_error_message</span><a class=\"heading-anchor\" href=\"#django.db.models.BaseConstraint.violation_error_message\"><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 message d’erreur utilisé lorsque <code class=\"docutils literal notranslate\">ValidationError</code> est générée pendant la <a class=\"reference internal\" href=\"/fr/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">phase de validation des modèles</span></a>. Contient par défaut <code class=\"docutils literal notranslate\">&quot;La contrainte %(name)sn'est pas respectée&quot;</code>.</p>\n</section>\n<section id=\"validate\">\n<h3><code class=\"docutils literal notranslate\">validate()</code><a class=\"heading-anchor\" href=\"#validate\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.BaseConstraint.validate\">\n<span class=\"sig-prename descclassname\">BaseConstraint.</span><span class=\"sig-name descname\">validate</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model</em>, <em class=\"sig-param\">instance</em>, <em class=\"sig-param\">exclude<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">DEFAULT_DB_ALIAS</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.BaseConstraint.validate\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Valide que la contrainte définie sur le modèle est respectée pour l’instance. Cela produira une requête vers la base de données pour s’assurer que la contrainte est bien respectée. Si des champs de la liste <code class=\"docutils literal notranslate\">exclude</code> sont nécessaires pour valider la contrainte, celle-ci sera ignorée.</p>\n<p>Génère <code class=\"docutils literal notranslate\">ValidationError</code> lorsque la contrainte n’est pas respectée.</p>\n<p>Cette méthode doit être implémentée par les sous-classes.</p>\n</section>\n</section>\n<section id=\"checkconstraint\">\n<h2><code class=\"docutils literal notranslate\">CheckConstraint</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\">class</span> </em><span class=\"sig-name descname\">CheckConstraint</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\">*</abbr></span></em>, <em class=\"sig-param\">check</em>, <em class=\"sig-param\">name</em>, <em class=\"sig-param\">violation_error_code<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">violation_error_message<span class=\"o\">=</span><span class=\"default_value\">None</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\">check</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\">CheckConstraint.</span><span class=\"sig-name descname\">check</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/5.0/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\">Q</code></a> ou une <a class=\"reference internal\" href=\"/fr/5.0/ref/models/expressions/#django.db.models.Expression\" title=\"django.db.models.Expression\"><code class=\"xref py py-class docutils literal notranslate\">Expression</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\">CheckConstraint(check=Q(age__gte=18), name='age_gte_18')</code> s’assure que le champ age n’est jamais au-dessous de 18.</p>\n<aside class=\"admonition-expression-order admonition\" role=\"note\">\n<p class=\"admonition-title\">Ordre des expressions</p>\n<p>L’ordre des arguments <code class=\"docutils literal notranslate\">Q</code> n’est pas forcément préservé. Toutefois, l’ordre des expressions <code class=\"docutils literal notranslate\">Q</code> elles-mêmes est conservé. Cela peut être important pour les bases de données qui préservent l’ordre des expressions de contrôle de contrainte pour des raisons de performance. Par exemple, utilisez le format suivant si l’ordre est important :</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>CheckConstraint<span class=\"p\">(</span>\n    check<span class=\"o\">=</span>Q<span class=\"p\">(</span>age__gte<span class=\"o\">=</span><span class=\"mi\">18</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> Q<span class=\"p\">(</span>expensive_check<span class=\"o\">=</span>condition<span class=\"p\">),</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;age_gte_18_and_others&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n<aside class=\"admonition-oracle admonition\" role=\"note\">\n<p class=\"admonition-title\">Oracle</p>\n<p>Les contrôles avec des champs possiblement nuls avec Oracle doivent inclure une condition autorisant les valeurs <code class=\"docutils literal notranslate\">NULL</code> afin que <a class=\"reference internal\" href=\"#django.db.models.BaseConstraint.validate\" title=\"django.db.models.BaseConstraint.validate\"><code class=\"xref py py-meth docutils literal notranslate\">validate()</code></a> se comporte de la même façon que la validation des contraintes de contrôle. Par exemple, si <code class=\"docutils literal notranslate\">age</code> est un champ pouvant être nul</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>CheckConstraint<span class=\"p\">(</span>check<span class=\"o\">=</span>Q<span class=\"p\">(</span>age__gte<span class=\"o\">=</span><span class=\"mi\">18</span><span class=\"p\">)</span> <span class=\"o\">|</span> Q<span class=\"p\">(</span>age__isnull<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;age_gte_18&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n</section>\n<section id=\"uniqueconstraint\">\n<h2><code class=\"docutils literal notranslate\">UniqueConstraint</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\">class</span> </em><span class=\"sig-name descname\">UniqueConstraint</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>expressions</em>, <em class=\"sig-param\">fields<span class=\"o\">=</span><span class=\"default_value\">()</span></em>, <em class=\"sig-param\">name<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">condition<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">deferrable<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">include<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">opclasses<span class=\"o\">=</span><span class=\"default_value\">()</span></em>, <em class=\"sig-param\">nulls_distinct<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">violation_error_code<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">violation_error_message<span class=\"o\">=</span><span class=\"default_value\">None</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\">expressions</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\">UniqueConstraint.</span><span class=\"sig-name descname\">expressions</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<p>L’argument positionnel <code class=\"docutils literal notranslate\">*expressions</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>UniqueConstraint<span class=\"p\">(</span>Lower<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>desc<span class=\"p\">(),</span> <span class=\"s2\">&quot;category&quot;</span><span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_lower_name_category&quot;</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\">name</code> dans l’ordre alphabétique inverse et le champ <code class=\"docutils literal notranslate\">category</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/5.0/ref/models/indexes/#django.db.models.Index.expressions\" title=\"django.db.models.Index.expressions\"><code class=\"xref py py-attr docutils literal notranslate\">Index.expressions</code></a>.</p>\n</section>\n<section id=\"fields\">\n<h3><code class=\"docutils literal notranslate\">fields</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\">UniqueConstraint.</span><span class=\"sig-name descname\">fields</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\">UniqueConstraint(fields=['chambre', 'date'], name='reservation_unique')</code> s’assure que chaque chambre ne peut être réservée qu’une seule fois par date.</p>\n</section>\n<section id=\"condition\">\n<h3><code class=\"docutils literal notranslate\">condition</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\">UniqueConstraint.</span><span class=\"sig-name descname\">condition</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/5.0/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\">Q</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>UniqueConstraint<span class=\"p\">(</span>fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;user&quot;</span><span class=\"p\">],</span> condition<span class=\"o\">=</span>Q<span class=\"p\">(</span>status<span class=\"o\">=</span><span class=\"s2\">&quot;DRAFT&quot;</span><span class=\"p\">),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_draft_user&quot;</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/5.0/ref/models/indexes/#django.db.models.Index.condition\" title=\"django.db.models.Index.condition\"><code class=\"xref py py-attr docutils literal notranslate\">Index.condition</code></a>.</p>\n</section>\n<section id=\"deferrable\">\n<h3><code class=\"docutils literal notranslate\">deferrable</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\">UniqueConstraint.</span><span class=\"sig-name descname\">deferrable</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\">Deferrable.DEFERRED</code> ou <code class=\"docutils literal notranslate\">Deferrable.IMMEDIATE</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=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Deferrable<span class=\"p\">,</span> UniqueConstraint\n\nUniqueConstraint<span class=\"p\">(</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_order&quot;</span><span class=\"p\">,</span>\n    fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;order&quot;</span><span class=\"p\">],</span>\n    deferrable<span class=\"o\">=</span>Deferrable<span class=\"o\">.</span>DEFERRED<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\" role=\"note\">\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\">include</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\">UniqueConstraint.</span><span class=\"sig-name descname\">include</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<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\">include</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\">fields</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>UniqueConstraint<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_booking&quot;</span><span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;room&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;date&quot;</span><span class=\"p\">],</span> include<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;full_name&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>permettra le filtrage sur <code class=\"docutils literal notranslate\">room</code> et <code class=\"docutils literal notranslate\">date</code>, sélectionnant aussi <code class=\"docutils literal notranslate\">full_name</code>, tout en ne récupérant les données qu’à partir de l’index.</p>\n<p>Les contraintes d’unicité sur des colonnes n’étant pas des clés sont ignorées dans les bases de données autres que 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/5.0/ref/models/indexes/#django.db.models.Index.include\" title=\"django.db.models.Index.include\"><code class=\"xref py py-attr docutils literal notranslate\">Index.include</code></a>.</p>\n</section>\n<section id=\"opclasses\">\n<h3><code class=\"docutils literal notranslate\">opclasses</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\">UniqueConstraint.</span><span class=\"sig-name descname\">opclasses</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<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>UniqueConstraint<span class=\"p\">(</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_username&quot;</span><span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;username&quot;</span><span class=\"p\">],</span> opclasses<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;varchar_pattern_ops&quot;</span><span class=\"p\">]</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>crée un index unique sur <code class=\"docutils literal notranslate\">username</code> en utilisant <code class=\"docutils literal notranslate\">varchar_pattern_ops</code>.</p>\n<p><code class=\"docutils literal notranslate\">opclasses</code> est ignoré pour les bases de données autres que PostgreSQL.</p>\n</section>\n<section id=\"nulls-distinct\">\n<h3><code class=\"docutils literal notranslate\">nulls_distinct</code><a class=\"heading-anchor\" href=\"#nulls-distinct\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"5.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.0</p></aside>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.UniqueConstraint.nulls_distinct\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">nulls_distinct</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.nulls_distinct\"><span class=\"visually-hidden\">Lien vers cette définition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>Indique si les lignes contenant des valeurs <code class=\"docutils literal notranslate\">NULL</code> couvertes par la contrainte d’unicité doivent être considérées comme distinctes les unes des autres. La valeur par défaut est <code class=\"docutils literal notranslate\">None</code>, ce qui indique que la valeur par défaut de la base de données est utilisée, celle-ci étant <code class=\"docutils literal notranslate\">True</code> pour la majorité des moteurs.</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>UniqueConstraint<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;ordering&quot;</span><span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;ordering&quot;</span><span class=\"p\">],</span> nulls_distinct<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>crée une contrainte d’unicité qui n’autorise qu’une seule colonne à contenir une valeur <code class=\"docutils literal notranslate\">NULL</code> dans la colonne <code class=\"docutils literal notranslate\">ordering</code>.</p>\n<p>Les contraintes d’unicité avec <code class=\"docutils literal notranslate\">nulls_distinct</code> sont ignorées dans les bases de données autres que PostgreSQL 15+.</p>\n</section>\n<section id=\"id1\">\n<h3><code class=\"docutils literal notranslate\">violation_error_code</code><a class=\"heading-anchor\" href=\"#id1\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"5.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.0</p></aside>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.UniqueConstraint.violation_error_code\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">violation_error_code</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.violation_error_code\"><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 code d’erreur utilisé lorsque <code class=\"docutils literal notranslate\">ValidationError</code> est générée pendant la <a class=\"reference internal\" href=\"/fr/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">phase de validation des modèles</span></a>. Contient <code class=\"docutils literal notranslate\">None</code> par défaut.</p>\n<p>Ce code <em>n’est pas</em> utilisé pour les contraintes <a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint\" title=\"django.db.models.UniqueConstraint\"><code class=\"xref py py-class docutils literal notranslate\">UniqueConstraint</code></a> avec <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\">fields</code></a> et 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\">condition</code></a>. De telles contraintes possèdent le même code d’erreur que les contraintes définies avec <a class=\"reference internal\" href=\"/fr/5.0/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\">Field.unique</code></a> ou dans <a class=\"reference internal\" href=\"/fr/5.0/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\">Meta.unique_together</code></a>.</p>\n</section>\n<section id=\"id2\">\n<h3><code class=\"docutils literal notranslate\">violation_error_message</code><a class=\"heading-anchor\" href=\"#id2\"><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.violation_error_message\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">violation_error_message</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.violation_error_message\"><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 message d’erreur utilisé lorsque <code class=\"docutils literal notranslate\">ValidationError</code> est générée pendant la <a class=\"reference internal\" href=\"/fr/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">phase de validation des modèles</span></a>. Contient par défaut <a class=\"reference internal\" href=\"#django.db.models.BaseConstraint.violation_error_message\" title=\"django.db.models.BaseConstraint.violation_error_message\"><code class=\"xref py py-attr docutils literal notranslate\">BaseConstraint.violation_error_message</code></a>.</p>\n<p>Ce message <em>n’est pas</em> utilisé pour les contraintes <a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint\" title=\"django.db.models.UniqueConstraint\"><code class=\"xref py py-class docutils literal notranslate\">UniqueConstraint</code></a> avec <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\">fields</code></a> et 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\">condition</code></a>. De telles contraintes affichent le même message que les contraintes définies avec <a class=\"reference internal\" href=\"/fr/5.0/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\">Field.unique</code></a> ou dans <a class=\"reference internal\" href=\"/fr/5.0/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\">Meta.unique_together</code></a>.</p>\n</section>\n</section>","rootId":"module-django.db.models.constraints","toc":[{"title":"BaseConstraint","anchor":"baseconstraint","children":[{"title":"name","anchor":"name","children":[]},{"title":"violation_error_code","anchor":"violation-error-code","children":[]},{"title":"violation_error_message","anchor":"violation-error-message","children":[]},{"title":"validate()","anchor":"validate","children":[]}]},{"title":"CheckConstraint","anchor":"checkconstraint","children":[{"title":"check","anchor":"check","children":[]}]},{"title":"UniqueConstraint","anchor":"uniqueconstraint","children":[{"title":"expressions","anchor":"expressions","children":[]},{"title":"fields","anchor":"fields","children":[]},{"title":"condition","anchor":"condition","children":[]},{"title":"deferrable","anchor":"deferrable","children":[]},{"title":"include","anchor":"include","children":[]},{"title":"opclasses","anchor":"opclasses","children":[]},{"title":"nulls_distinct","anchor":"nulls-distinct","children":[]},{"title":"violation_error_code","anchor":"id1","children":[]},{"title":"violation_error_message","anchor":"id2","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/5.0/ref/"},{"docname":"ref/models/index","title":"Modèles","url":"/fr/5.0/ref/models/"}],"prev":{"docname":"ref/models/indexes","title":"Référence des index de modèle","url":"/fr/5.0/ref/models/indexes/"},"next":{"docname":"ref/models/meta","title":"L’API _meta des modèles","url":"/fr/5.0/ref/models/meta/"},"formats":{"html":"/fr/5.0/ref/models/constraints/","markdown":"/fr/5.0/ref/models/constraints.md","json":"/fr/5.0/ref/models/constraints.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/ref/models/constraints.txt","official":"https://docs.djangoproject.com/fr/5.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"]}