{"title":"Contraintes de bases de données spécifiques à PostgreSQL","version":"4.2","locale":"fr","docname":"ref/contrib/postgres/constraints","url":"/fr/4.2/ref/contrib/postgres/constraints/","canonical":"https://djangodocs.dev/fr/4.2/ref/contrib/postgres/constraints/","summary":"PostgreSQL offre des contraintes d’intégrité de données supplémentaires dans le module django.contrib.postgres.constraints.","html":"<span id=\"postgresql-specific-database-constraints\"></span><h1>Contraintes de bases de données spécifiques à PostgreSQL<a class=\"heading-anchor\" href=\"#module-django.contrib.postgres.constraints\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>PostgreSQL offre des contraintes d’intégrité de données supplémentaires dans le module <code class=\"docutils literal notranslate\">django.contrib.postgres.constraints</code>. Elles sont ajoutées dans l’option <a class=\"reference internal\" href=\"/fr/4.2/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<section id=\"exclusionconstraint\">\n<h2><code class=\"docutils literal notranslate\">ExclusionConstraint</code><a class=\"heading-anchor\" href=\"#exclusionconstraint\"><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.contrib.postgres.constraints.ExclusionConstraint\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">ExclusionConstraint</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\">name</em>, <em class=\"sig-param\">expressions</em>, <em class=\"sig-param\">index_type<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\">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.contrib.postgres.constraints.ExclusionConstraint\"><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’exclusion dans la base de données. En interne, PostgreSQL implémente les contraintes d’exclusion par des index. Le type d’index par défaut est <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/gist.html\">GiST</a>. Pour les utiliser, vous devez activer <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/btree-gist.html\">l’extension btree_gist</a> dans PostgreSQL. Vous pouvez installer l’extension par une opération de migration <a class=\"reference internal\" href=\"/fr/4.2/ref/contrib/postgres/operations/#django.contrib.postgres.operations.BtreeGistExtension\" title=\"django.contrib.postgres.operations.BtreeGistExtension\"><code class=\"xref py py-class docutils literal notranslate\">BtreeGistExtension</code></a>.</p>\n<p>Si vous essayez d’insérer une nouvelle ligne qui entre en conflit avec une ligne existante, une erreur <a class=\"reference internal\" href=\"/fr/4.2/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\">IntegrityError</code></a> se produit. De même lorsqu’un conflit survient lors d’une mise à jour.</p>\n<p>Les contraintes d’exclusion sont vérifiées durant la <a class=\"reference internal\" href=\"/fr/4.2/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">validation des modèles</span></a>.</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>Dans les versions précédentes, les contraintes d’exclusion n’étaient pas vérifiées durant la validation des modèles.</p>\n</aside>\n</dd></dl>\n\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.contrib.postgres.constraints.ExclusionConstraint.name\">\n<span class=\"sig-prename descclassname\">ExclusionConstraint.</span><span class=\"sig-name descname\">name</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.constraints.ExclusionConstraint.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>Voir <a class=\"reference internal\" href=\"/fr/4.2/ref/models/constraints/#django.db.models.BaseConstraint.name\" title=\"django.db.models.BaseConstraint.name\"><code class=\"xref py py-attr docutils literal notranslate\">BaseConstraint.name</code></a>.</p>\n</section>\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.contrib.postgres.constraints.ExclusionConstraint.expressions\">\n<span class=\"sig-prename descclassname\">ExclusionConstraint.</span><span class=\"sig-name descname\">expressions</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.constraints.ExclusionConstraint.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>Un itérable de tuples binaires. Le premier élément est une expression ou une chaîne. Le second élément est un opérateur SQL sous forme de chaîne. Pour éviter les erreurs syntaxiques, vous pouvez utiliser <a class=\"reference internal\" href=\"/fr/4.2/ref/contrib/postgres/fields/#django.contrib.postgres.fields.RangeOperators\" title=\"django.contrib.postgres.fields.RangeOperators\"><code class=\"xref py py-class docutils literal notranslate\">RangeOperators</code></a> qui fait correspondre les opérateurs à des chaînes. 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>expressions <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;timespan&quot;</span><span class=\"p\">,</span> RangeOperators<span class=\"o\">.</span>ADJACENT_TO<span class=\"p\">),</span>\n    <span class=\"p\">(</span>F<span class=\"p\">(</span><span class=\"s2\">&quot;room&quot;</span><span class=\"p\">),</span> RangeOperators<span class=\"o\">.</span>EQUAL<span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition-restrictions-on-operators admonition\" role=\"note\">\n<p class=\"admonition-title\">Restrictions sur les opérateurs.</p>\n<p>Seuls des opérateurs commutatifs peuvent être utilisés dans des contraintes d’exclusion.</p>\n</aside>\n<p>L’expression <a class=\"reference internal\" href=\"/fr/4.2/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.OpClass\" title=\"django.contrib.postgres.indexes.OpClass\"><code class=\"xref py py-class docutils literal notranslate\">OpClass()</code></a> peut être utilisée pour indiquer une <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/indexes-opclass.html\">classe d’opérateur</a> personnalisée pour les expressions de contrainte. 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>expressions <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">(</span>OpClass<span class=\"p\">(</span><span class=\"s2\">&quot;circle&quot;</span><span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;circle_ops&quot;</span><span class=\"p\">),</span> RangeOperators<span class=\"o\">.</span>OVERLAPS<span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>crée une contrainte d’exclusion sur <code class=\"docutils literal notranslate\">circle</code> en utilisant <code class=\"docutils literal notranslate\">circle_ops</code>.</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>La prise en charge de l’expression <code class=\"docutils literal notranslate\">OpClass()</code> a été ajoutée.</p>\n</aside>\n</section>\n<section id=\"index-type\">\n<h3><code class=\"docutils literal notranslate\">index_type</code><a class=\"heading-anchor\" href=\"#index-type\"><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.contrib.postgres.constraints.ExclusionConstraint.index_type\">\n<span class=\"sig-prename descclassname\">ExclusionConstraint.</span><span class=\"sig-name descname\">index_type</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.constraints.ExclusionConstraint.index_type\"><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 type d’index de la contrainte. La valeurs admises sont <code class=\"docutils literal notranslate\">GIST</code> ou <code class=\"docutils literal notranslate\">SPGIST</code>. Les correspondances ne tiennent pas compte de la casse. En cas d’absence, le type d’index par défaut est <code class=\"docutils literal notranslate\">GIST</code>.</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.contrib.postgres.constraints.ExclusionConstraint.condition\">\n<span class=\"sig-prename descclassname\">ExclusionConstraint.</span><span class=\"sig-name descname\">condition</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.constraints.ExclusionConstraint.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.2/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 de restriction d’une contrainte à un sous-ensemble de lignes. Par exemple, <code class=\"docutils literal notranslate\">condition=Q(annule=False)</code>.</p>\n<p>Ces conditions sont soumises aux mêmes restrictions de base de données que <a class=\"reference internal\" href=\"/fr/4.2/ref/models/indexes/#django.db.models.Index.condition\" title=\"django.db.models.Index.condition\"><code class=\"xref py py-attr docutils literal notranslate\">django.db.models.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.contrib.postgres.constraints.ExclusionConstraint.deferrable\">\n<span class=\"sig-prename descclassname\">ExclusionConstraint.</span><span class=\"sig-name descname\">deferrable</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.constraints.ExclusionConstraint.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’exclusion 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.contrib.postgres.constraints</span> <span class=\"kn\">import</span> ExclusionConstraint\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.fields</span> <span class=\"kn\">import</span> RangeOperators\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Deferrable\n\n\nExclusionConstraint<span class=\"p\">(</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;exclude_overlapping_deferred&quot;</span><span class=\"p\">,</span>\n    expressions<span class=\"o\">=</span><span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;timespan&quot;</span><span class=\"p\">,</span> RangeOperators<span class=\"o\">.</span>OVERLAPS<span class=\"p\">),</span>\n    <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 admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Les contraintes d’exclusion 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.contrib.postgres.constraints.ExclusionConstraint.include\">\n<span class=\"sig-prename descclassname\">ExclusionConstraint.</span><span class=\"sig-name descname\">include</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.constraints.ExclusionConstraint.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 la contrainte d’exclusion de couverture, 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.contrib.postgres.constraints.ExclusionConstraint.include\" title=\"django.contrib.postgres.constraints.ExclusionConstraint.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.contrib.postgres.constraints.ExclusionConstraint.expressions\" title=\"django.contrib.postgres.constraints.ExclusionConstraint.expressions\"><code class=\"xref py py-attr docutils literal notranslate\">expressions</code></a>).</p>\n<p><code class=\"docutils literal notranslate\">include</code> est pris en charge par les index GiST. PostgreSQL 14+ prend aussi en charge <code class=\"docutils literal notranslate\">include</code> pour les index SP-GiST.</p>\n<aside class=\"version-note version-changed\" data-version=\"4.1\" role=\"note\">\n<p class=\"version-note-title\">Changed in Django 4.1</p><p>La prise en charge des contraintes de couverture d’exclusion utilisant les index SP-GiST à partir de PostgreSQL 14+ a été ajoutée.</p>\n</aside>\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.contrib.postgres.constraints.ExclusionConstraint.opclasses\">\n<span class=\"sig-prename descclassname\">ExclusionConstraint.</span><span class=\"sig-name descname\">opclasses</span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.constraints.ExclusionConstraint.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 cette contrainte. Si vous nécessitez une classe d’opérateur personnalisée, vous devez en fournir une pour chaque expression de la contrainte.</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>ExclusionConstraint<span class=\"p\">(</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;exclude_overlapping_opclasses&quot;</span><span class=\"p\">,</span>\n    expressions<span class=\"o\">=</span><span class=\"p\">[(</span><span class=\"s2\">&quot;circle&quot;</span><span class=\"p\">,</span> RangeOperators<span class=\"o\">.</span>OVERLAPS<span class=\"p\">)],</span>\n    opclasses<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;circle_ops&quot;</span><span class=\"p\">],</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>crée une contrainte d’exclusion sur <code class=\"docutils literal notranslate\">circle</code> en utilisant <code class=\"docutils literal notranslate\">circle_ops</code>.</p>\n<aside class=\"version-note version-deprecated\" data-version=\"4.1\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 4.1</p><p><span class=\"versionmodified deprecated\">Obsolète depuis la version 4.1: </span>Le paramètre <code class=\"docutils literal notranslate\">opclasses</code> a été rendu obsolète en faveur de l’utilisation de <a class=\"reference internal\" href=\"/fr/4.2/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.OpClass\" title=\"django.contrib.postgres.indexes.OpClass\"><code class=\"xref py py-class docutils literal notranslate\">OpClass()</code></a> dans <a class=\"reference internal\" href=\"#django.contrib.postgres.constraints.ExclusionConstraint.expressions\" title=\"django.contrib.postgres.constraints.ExclusionConstraint.expressions\"><code class=\"xref py py-attr docutils literal notranslate\">expressions</code></a>.</p>\n</aside>\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<aside class=\"version-note version-added\" data-version=\"4.1\" role=\"note\">\n<p class=\"version-note-title\">New in Django 4.1</p></aside>\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/4.2/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=\"/fr/4.2/ref/models/constraints/#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</section>\n<section id=\"examples\">\n<h3>Exemples<a class=\"heading-anchor\" href=\"#examples\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>L’exemple suivant évite les chevauchements de réservations d’une même salle, sans tenir compte des réservations annulées</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.contrib.postgres.constraints</span> <span class=\"kn\">import</span> ExclusionConstraint\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.fields</span> <span class=\"kn\">import</span> DateTimeRangeField<span class=\"p\">,</span> RangeOperators\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Q\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Room</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    number <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Reservation</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    room <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span><span class=\"s2\">&quot;Room&quot;</span><span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    timespan <span class=\"o\">=</span> DateTimeRangeField<span class=\"p\">()</span>\n    cancelled <span class=\"o\">=</span> models<span class=\"o\">.</span>BooleanField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        constraints <span class=\"o\">=</span> <span class=\"p\">[</span>\n            ExclusionConstraint<span class=\"p\">(</span>\n                name<span class=\"o\">=</span><span class=\"s2\">&quot;exclude_overlapping_reservations&quot;</span><span class=\"p\">,</span>\n                expressions<span class=\"o\">=</span><span class=\"p\">[</span>\n                    <span class=\"p\">(</span><span class=\"s2\">&quot;timespan&quot;</span><span class=\"p\">,</span> RangeOperators<span class=\"o\">.</span>OVERLAPS<span class=\"p\">),</span>\n                    <span class=\"p\">(</span><span class=\"s2\">&quot;room&quot;</span><span class=\"p\">,</span> RangeOperators<span class=\"o\">.</span>EQUAL<span class=\"p\">),</span>\n                <span class=\"p\">],</span>\n                condition<span class=\"o\">=</span>Q<span class=\"p\">(</span>cancelled<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">),</span>\n            <span class=\"p\">),</span>\n        <span class=\"p\">]</span>\n</code></pre></div>\n<p>Dans le cas où un modèle définit un intervalle avec deux champs, au lieu des types d’intervalle natifs de PostgreSQL, vous devriez écrire une expression qui utilise la fonction équivalente (par ex.  <code class=\"docutils literal notranslate\">TsTzRange()</code>), et utiliser les délimiteurs du champ. La plupart du temps, les délimiteurs seront <code class=\"docutils literal notranslate\">'[)'</code>, ce qui signifie que la limite inférieure est inclusive et la limite supérieure exclusive. Vous pouvez utiliser <a class=\"reference internal\" href=\"/fr/4.2/ref/contrib/postgres/fields/#django.contrib.postgres.fields.RangeBoundary\" title=\"django.contrib.postgres.fields.RangeBoundary\"><code class=\"xref py py-class docutils literal notranslate\">RangeBoundary</code></a> qui fournit des correspondances d’expression pour les <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-INCLUSIVITY\">limites d’intervalle</a>. 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.contrib.postgres.constraints</span> <span class=\"kn\">import</span> ExclusionConstraint\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.postgres.fields</span> <span class=\"kn\">import</span> <span class=\"p\">(</span>\n    DateTimeRangeField<span class=\"p\">,</span>\n    RangeBoundary<span class=\"p\">,</span>\n    RangeOperators<span class=\"p\">,</span>\n<span class=\"p\">)</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> models\n<span class=\"kn\">from</span> <span class=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Func<span class=\"p\">,</span> Q\n\n\n<span class=\"k\">class</span> <span class=\"nc\">TsTzRange</span><span class=\"p\">(</span>Func<span class=\"p\">):</span>\n    function <span class=\"o\">=</span> <span class=\"s2\">&quot;TSTZRANGE&quot;</span>\n    output_field <span class=\"o\">=</span> DateTimeRangeField<span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">Reservation</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    room <span class=\"o\">=</span> models<span class=\"o\">.</span>ForeignKey<span class=\"p\">(</span><span class=\"s2\">&quot;Room&quot;</span><span class=\"p\">,</span> on_delete<span class=\"o\">=</span>models<span class=\"o\">.</span>CASCADE<span class=\"p\">)</span>\n    start <span class=\"o\">=</span> models<span class=\"o\">.</span>DateTimeField<span class=\"p\">()</span>\n    end <span class=\"o\">=</span> models<span class=\"o\">.</span>DateTimeField<span class=\"p\">()</span>\n    cancelled <span class=\"o\">=</span> models<span class=\"o\">.</span>BooleanField<span class=\"p\">(</span>default<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span> <span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        constraints <span class=\"o\">=</span> <span class=\"p\">[</span>\n            ExclusionConstraint<span class=\"p\">(</span>\n                name<span class=\"o\">=</span><span class=\"s2\">&quot;exclude_overlapping_reservations&quot;</span><span class=\"p\">,</span>\n                expressions<span class=\"o\">=</span><span class=\"p\">[</span>\n                    <span class=\"p\">(</span>\n                        TsTzRange<span class=\"p\">(</span><span class=\"s2\">&quot;start&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;end&quot;</span><span class=\"p\">,</span> RangeBoundary<span class=\"p\">()),</span>\n                        RangeOperators<span class=\"o\">.</span>OVERLAPS<span class=\"p\">,</span>\n                    <span class=\"p\">),</span>\n                    <span class=\"p\">(</span><span class=\"s2\">&quot;room&quot;</span><span class=\"p\">,</span> RangeOperators<span class=\"o\">.</span>EQUAL<span class=\"p\">),</span>\n                <span class=\"p\">],</span>\n                condition<span class=\"o\">=</span>Q<span class=\"p\">(</span>cancelled<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">),</span>\n            <span class=\"p\">),</span>\n        <span class=\"p\">]</span>\n</code></pre></div>\n</section>\n</section>","rootId":"module-django.contrib.postgres.constraints","toc":[{"title":"ExclusionConstraint","anchor":"exclusionconstraint","children":[{"title":"name","anchor":"name","children":[]},{"title":"expressions","anchor":"expressions","children":[]},{"title":"index_type","anchor":"index-type","children":[]},{"title":"condition","anchor":"condition","children":[]},{"title":"deferrable","anchor":"deferrable","children":[]},{"title":"include","anchor":"include","children":[]},{"title":"opclasses","anchor":"opclasses","children":[]},{"title":"violation_error_message","anchor":"violation-error-message","children":[]},{"title":"Exemples","anchor":"examples","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"Référence de l’API","url":"/fr/4.2/ref/"},{"docname":"ref/contrib/index","title":"Paquets contrib","url":"/fr/4.2/ref/contrib/"},{"docname":"ref/contrib/postgres/index","title":"django.contrib.postgres","url":"/fr/4.2/ref/contrib/postgres/"}],"prev":{"docname":"ref/contrib/postgres/aggregates","title":"Fonctions d’agrégation spécifiques à PostgreSQL","url":"/fr/4.2/ref/contrib/postgres/aggregates/"},"next":{"docname":"ref/contrib/postgres/expressions","title":"Expressions de requête spécifiques à PostgreSQL","url":"/fr/4.2/ref/contrib/postgres/expressions/"},"formats":{"html":"/fr/4.2/ref/contrib/postgres/constraints/","markdown":"/fr/4.2/ref/contrib/postgres/constraints.md","json":"/fr/4.2/ref/contrib/postgres/constraints.json"},"source":"https://github.com/django/django/blob/stable/4.2.x/docs/ref/contrib/postgres/constraints.txt","official":"https://docs.djangoproject.com/fr/4.2/ref/contrib/postgres/constraints/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}