{"title":"Contraintes de bases de données spécifiques à PostgreSQL","version":"5.1","locale":"fr","docname":"ref/contrib/postgres/constraints","url":"/fr/5.1/ref/contrib/postgres/constraints/","canonical":"https://djangodocs.dev/fr/5.1/ref/contrib/postgres/constraints/","summary":"PostgreSQL offre des contraintes d’intégrité de données supplémentaires dans le module django.contrib.postgres.constraints . Elles sont ajoutées dans l’option…","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\"><span class=\"pre\">django.contrib.postgres.constraints</span></code>. Elles sont ajoutées dans l’option <a class=\"reference internal\" href=\"/fr/5.1/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.constraints</span></code></a> des modèles.</p>\n<section id=\"exclusionconstraint\">\n<h2><code class=\"docutils literal notranslate\"><span class=\"pre\">ExclusionConstraint</span></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\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">ExclusionConstraint</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\">name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">expressions</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">index_type</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\">violation_error_code</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\">violation_error_message</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.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/5.1/ref/contrib/postgres/operations/#django.contrib.postgres.operations.BtreeGistExtension\" title=\"django.contrib.postgres.operations.BtreeGistExtension\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">BtreeGistExtension</span></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/5.1/ref/exceptions/#django.db.IntegrityError\" title=\"django.db.IntegrityError\"><code class=\"xref py py-exc docutils literal notranslate\"><span class=\"pre\">IntegrityError</span></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/5.1/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">validation des modèles</span></a>.</p>\n</dd></dl>\n\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.contrib.postgres.constraints.ExclusionConstraint.name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">ExclusionConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">name</span></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/5.1/ref/models/constraints/#django.db.models.BaseConstraint.name\" title=\"django.db.models.BaseConstraint.name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">BaseConstraint.name</span></code></a>.</p>\n</section>\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.contrib.postgres.constraints.ExclusionConstraint.expressions\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">ExclusionConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">expressions</span></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/5.1/ref/contrib/postgres/fields/#django.contrib.postgres.fields.RangeOperators\" title=\"django.contrib.postgres.fields.RangeOperators\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RangeOperators</span></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><span class=\"n\">expressions</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"s2\">&quot;timespan&quot;</span><span class=\"p\">,</span> <span class=\"n\">RangeOperators</span><span class=\"o\">.</span><span class=\"n\">ADJACENT_TO</span><span class=\"p\">),</span>\n    <span class=\"p\">(</span><span class=\"n\">F</span><span class=\"p\">(</span><span class=\"s2\">&quot;room&quot;</span><span class=\"p\">),</span> <span class=\"n\">RangeOperators</span><span class=\"o\">.</span><span class=\"n\">EQUAL</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<aside class=\"admonition-restrictions-on-operators admonition\">\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/5.1/ref/contrib/postgres/indexes/#django.contrib.postgres.indexes.OpClass\" title=\"django.contrib.postgres.indexes.OpClass\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OpClass()</span></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><span class=\"n\">expressions</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"p\">(</span><span class=\"n\">OpClass</span><span class=\"p\">(</span><span class=\"s2\">&quot;circle&quot;</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;circle_ops&quot;</span><span class=\"p\">),</span> <span class=\"n\">RangeOperators</span><span class=\"o\">.</span><span class=\"n\">OVERLAPS</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\"><span class=\"pre\">circle</span></code> en utilisant <code class=\"docutils literal notranslate\"><span class=\"pre\">circle_ops</span></code>.</p>\n</section>\n<section id=\"index-type\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">index_type</span></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\"><span class=\"pre\">ExclusionConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">index_type</span></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\"><span class=\"pre\">GIST</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">SPGIST</span></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\"><span class=\"pre\">GIST</span></code>.</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.contrib.postgres.constraints.ExclusionConstraint.condition\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">ExclusionConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">condition</span></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/5.1/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Q</span></code></a> qui indique la condition de restriction d’une contrainte à un sous-ensemble de lignes. Par exemple, <code class=\"docutils literal notranslate\"><span class=\"pre\">condition=Q(annule=False)</span></code>.</p>\n<p>Ces conditions sont soumises aux mêmes restrictions de base de données que <a class=\"reference internal\" href=\"/fr/5.1/ref/models/indexes/#django.db.models.Index.condition\" title=\"django.db.models.Index.condition\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">django.db.models.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.contrib.postgres.constraints.ExclusionConstraint.deferrable\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">ExclusionConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">deferrable</span></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\"><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.contrib.postgres.constraints</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ExclusionConstraint</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.postgres.fields</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">RangeOperators</span>\n<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>\n\n\n<span class=\"n\">ExclusionConstraint</span><span class=\"p\">(</span>\n    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;exclude_overlapping_deferred&quot;</span><span class=\"p\">,</span>\n    <span class=\"n\">expressions</span><span class=\"o\">=</span><span class=\"p\">[</span>\n        <span class=\"p\">(</span><span class=\"s2\">&quot;timespan&quot;</span><span class=\"p\">,</span> <span class=\"n\">RangeOperators</span><span class=\"o\">.</span><span class=\"n\">OVERLAPS</span><span class=\"p\">),</span>\n    <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 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\"><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.contrib.postgres.constraints.ExclusionConstraint.include\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">ExclusionConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">include</span></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\"><span class=\"pre\">include</span></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\"><span class=\"pre\">expressions</span></code></a>).</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">include</span></code> est pris en charge par les index GiST. PostgreSQL 14+ prend aussi en charge <code class=\"docutils literal notranslate\"><span class=\"pre\">include</span></code> pour les index SP-GiST.</p>\n</section>\n<section id=\"violation-error-code\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">violation_error_code</span></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\">\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.contrib.postgres.constraints.ExclusionConstraint.violation_error_code\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">ExclusionConstraint.</span></span><span class=\"sig-name descname\"><span class=\"pre\">violation_error_code</span></span><a class=\"heading-anchor\" href=\"#django.contrib.postgres.constraints.ExclusionConstraint.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\"><span class=\"pre\">ValidationError</span></code> est générée pendant la <a class=\"reference internal\" href=\"/fr/5.1/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">phase de validation des modèles</span></a>. Contient <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> par défaut.</p>\n</section>\n<section id=\"violation-error-message\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">violation_error_message</span></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<p>Le message d’erreur utilisé lorsque <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> est générée pendant la <a class=\"reference internal\" href=\"/fr/5.1/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/5.1/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\"><span class=\"pre\">BaseConstraint.violation_error_message</span></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=\"w\"> </span><span class=\"nn\">django.contrib.postgres.constraints</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ExclusionConstraint</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.postgres.fields</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">DateTimeRangeField</span><span class=\"p\">,</span> <span class=\"n\">RangeOperators</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<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\">Q</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Room</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">number</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Reservation</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">room</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"s2\">&quot;Room&quot;</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">timespan</span> <span class=\"o\">=</span> <span class=\"n\">DateTimeRangeField</span><span class=\"p\">()</span>\n    <span class=\"n\">cancelled</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">BooleanField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">constraints</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n            <span class=\"n\">ExclusionConstraint</span><span class=\"p\">(</span>\n                <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;exclude_overlapping_reservations&quot;</span><span class=\"p\">,</span>\n                <span class=\"n\">expressions</span><span class=\"o\">=</span><span class=\"p\">[</span>\n                    <span class=\"p\">(</span><span class=\"s2\">&quot;timespan&quot;</span><span class=\"p\">,</span> <span class=\"n\">RangeOperators</span><span class=\"o\">.</span><span class=\"n\">OVERLAPS</span><span class=\"p\">),</span>\n                    <span class=\"p\">(</span><span class=\"s2\">&quot;room&quot;</span><span class=\"p\">,</span> <span class=\"n\">RangeOperators</span><span class=\"o\">.</span><span class=\"n\">EQUAL</span><span class=\"p\">),</span>\n                <span class=\"p\">],</span>\n                <span class=\"n\">condition</span><span class=\"o\">=</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">cancelled</span><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\"><span class=\"pre\">TsTzRange()</span></code>), et utiliser les délimiteurs du champ. La plupart du temps, les délimiteurs seront <code class=\"docutils literal notranslate\"><span class=\"pre\">'[)'</span></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/5.1/ref/contrib/postgres/fields/#django.contrib.postgres.fields.RangeBoundary\" title=\"django.contrib.postgres.fields.RangeBoundary\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RangeBoundary</span></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=\"w\"> </span><span class=\"nn\">django.contrib.postgres.constraints</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ExclusionConstraint</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.postgres.fields</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"p\">(</span>\n    <span class=\"n\">DateTimeRangeField</span><span class=\"p\">,</span>\n    <span class=\"n\">RangeBoundary</span><span class=\"p\">,</span>\n    <span class=\"n\">RangeOperators</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<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\">Func</span><span class=\"p\">,</span> <span class=\"n\">Q</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">TsTzRange</span><span class=\"p\">(</span><span class=\"n\">Func</span><span class=\"p\">):</span>\n    <span class=\"n\">function</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;TSTZRANGE&quot;</span>\n    <span class=\"n\">output_field</span> <span class=\"o\">=</span> <span class=\"n\">DateTimeRangeField</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Reservation</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">room</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ForeignKey</span><span class=\"p\">(</span><span class=\"s2\">&quot;Room&quot;</span><span class=\"p\">,</span> <span class=\"n\">on_delete</span><span class=\"o\">=</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CASCADE</span><span class=\"p\">)</span>\n    <span class=\"n\">start</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateTimeField</span><span class=\"p\">()</span>\n    <span class=\"n\">end</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DateTimeField</span><span class=\"p\">()</span>\n    <span class=\"n\">cancelled</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">BooleanField</span><span class=\"p\">(</span><span class=\"n\">default</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n\n    <span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Meta</span><span class=\"p\">:</span>\n        <span class=\"n\">constraints</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n            <span class=\"n\">ExclusionConstraint</span><span class=\"p\">(</span>\n                <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;exclude_overlapping_reservations&quot;</span><span class=\"p\">,</span>\n                <span class=\"n\">expressions</span><span class=\"o\">=</span><span class=\"p\">[</span>\n                    <span class=\"p\">(</span>\n                        <span class=\"n\">TsTzRange</span><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> <span class=\"n\">RangeBoundary</span><span class=\"p\">()),</span>\n                        <span class=\"n\">RangeOperators</span><span class=\"o\">.</span><span class=\"n\">OVERLAPS</span><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> <span class=\"n\">RangeOperators</span><span class=\"o\">.</span><span class=\"n\">EQUAL</span><span class=\"p\">),</span>\n                <span class=\"p\">],</span>\n                <span class=\"n\">condition</span><span class=\"o\">=</span><span class=\"n\">Q</span><span class=\"p\">(</span><span class=\"n\">cancelled</span><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":"violation_error_code","anchor":"violation-error-code","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/5.1/ref/"},{"docname":"ref/contrib/index","title":"Paquets contrib","url":"/fr/5.1/ref/contrib/"},{"docname":"ref/contrib/postgres/index","title":"django.contrib.postgres","url":"/fr/5.1/ref/contrib/postgres/"}],"prev":{"docname":"ref/contrib/postgres/aggregates","title":"Fonctions d’agrégation spécifiques à PostgreSQL","url":"/fr/5.1/ref/contrib/postgres/aggregates/"},"next":{"docname":"ref/contrib/postgres/expressions","title":"Expressions de requête spécifiques à PostgreSQL","url":"/fr/5.1/ref/contrib/postgres/expressions/"},"formats":{"html":"/fr/5.1/ref/contrib/postgres/constraints/","markdown":"/fr/5.1/ref/contrib/postgres/constraints.md","json":"/fr/5.1/ref/contrib/postgres/constraints.json"},"source":"https://github.com/django/django/blob/stable/5.1.x/docs/ref/contrib/postgres/constraints.txt","official":"https://docs.djangoproject.com/fr/5.1/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"]}