{"title":"PostgreSQL 特有数据库约束","version":"6.1","locale":"zh-hans","docname":"ref/contrib/postgres/constraints","url":"/zh-hans/6.1/ref/contrib/postgres/constraints/","canonical":"https://djangodocs.dev/zh-hans/6.1/ref/contrib/postgres/constraints/","summary":"PostgreSQL 支持额外的数据完整性约束，可从 django.contrib.postgres.cracks 模块中获得。它们被添加到模型 Meta.constraints 选项中。 ExclusionConstraint Link to this heading # class ExclusionConstraint…","html":"<span id=\"postgresql-specific-database-constraints\"></span><h1>PostgreSQL 特有数据库约束<a class=\"heading-anchor\" href=\"#module-django.contrib.postgres.constraints\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>PostgreSQL 支持额外的数据完整性约束，可从 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.postgres.cracks</span></code> 模块中获得。它们被添加到模型 <code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.constraints</span></code> 选项中。</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\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>在数据库中创建一个排除约束。在内部，PostgreSQL 使用索引来实现排除约束的功能。默认的索引类型是 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/gist.html\">GiST</a> 。要使用它们，你需要激活 PostgreSQL 上的 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/btree-gist.html\">btree_gist 扩展</a> 。你可以使用 <a class=\"reference internal\" href=\"/zh-hans/6.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>如果你试图插入一条新的记录，而这条记录与现有的记录发生冲突，就会引发一个 <a class=\"reference internal\" href=\"/zh-hans/6.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>。同样，当更新与现有的记录冲突时，也会发出。</p>\n<p>排除约束在 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">模型验证</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\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>请参阅 <a class=\"reference internal\" href=\"/zh-hans/6.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\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>一个二元元组的迭代。第一个元素是一个表达式或字符串。第二个元素是一个用字符串表示的 SQL 操作符。为了避免错别字，你可以使用 <a class=\"reference internal\" href=\"/zh-hans/6.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> 将操作符与字符串进行映射。例如：</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\">对操作的限制。</p>\n<p>只有交换运算符才能用于排除约束。</p>\n</aside>\n<p><a class=\"reference internal\" href=\"/zh-hans/6.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> 表达式可用于为约束表达式指定自定义的 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/indexes-opclass.html\">operator class</a>。例如：</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>使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">circle_ops</span></code> 在 <code class=\"docutils literal notranslate\"><span class=\"pre\">circle</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\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>The index type of the constraint. Accepted values are <code class=\"docutils literal notranslate\"><span class=\"pre\">GiST</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">Hash</span></code>, or\n<code class=\"docutils literal notranslate\"><span class=\"pre\">SPGiST</span></code>. Matching is case insensitive. If not provided, the default index\ntype is <code class=\"docutils literal notranslate\"><span class=\"pre\">GIST</span></code>.</p>\n<aside class=\"version-note version-changed\" data-version=\"6.1\">\n<p class=\"version-note-title\">Changed in Django 6.1</p><p>Support for exclusion constraints using Hash indexes was added.</p>\n</aside>\n</section>\n<section id=\"condition\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">condition</span></code><a class=\"heading-anchor\" href=\"#condition\"><span class=\"visually-hidden\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>一个 <a class=\"reference internal\" href=\"/zh-hans/6.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> 对象，用于指定将约束条件限制在行的子集上。例如，<code class=\"docutils literal notranslate\"><span class=\"pre\">condition=Q(cancelled=False)</span></code>。</p>\n<p>这些条件与 <a class=\"reference internal\" href=\"/zh-hans/6.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\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>设置这一参数，可创建一个可推迟的排除限制。接受的值是 <code class=\"docutils literal notranslate\"><span class=\"pre\">Deferrable.DEFERRED</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">Deferrable.IMMEDIATE</span></code>。例如：</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<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>默认情况下，约束条件是不推迟的。推迟的约束条件在事务结束前不会被强制执行。即时约束将在每条命令后立即执行。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Warning</p>\n<p>延迟排除约束可能导致 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/sql-createtable.html#id-1.9.3.85.9.4\">性能惩罚</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\">Link to this heading</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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>一个包含在覆盖排除约束中作为非键列的字段名称的列表或元组。这允许只用索引扫描，用于只选择包含的字段（<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>）和只通过索引字段过滤（<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> is supported for GiST and SP-GiST indexes.</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\">Link to this heading</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.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\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">模型验证</span></a> 过程中引发 <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> 时使用的错误代码。默认值为 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>。</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\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>在 <a class=\"reference internal\" href=\"/zh-hans/6.1/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">模型验证</span></a> 期间引发 <code class=\"docutils literal notranslate\"><span class=\"pre\">ValidationError</span></code> 时使用的错误消息。默认为 <a class=\"reference internal\" href=\"/zh-hans/6.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>例子<a class=\"heading-anchor\" href=\"#examples\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>以下例子限制同一房间中的重复预订，而不考虑取消的预订：</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>如果你的模型使用两个字段定义了一个范围，而不是原生的 PostgreSQL 范围类型，你应该写一个使用等价函数的表达式（例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">TsTzRange()</span></code>），并使用字段的定界符。大多数情况下，定界符将是 <code class=\"docutils literal notranslate\"><span class=\"pre\">'[)'</span></code>，这意味着下界是包含性的，上界是排他性的。你可以使用 <a class=\"reference internal\" href=\"/zh-hans/6.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>，它为 <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/rangetypes.html#RANGETYPES-INCLUSIVITY\">range boundaries</a> 提供了一个表达式映射。例如：</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":"例子","anchor":"examples","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/6.1/ref/"},{"docname":"ref/contrib/index","title":"contrib 包","url":"/zh-hans/6.1/ref/contrib/"},{"docname":"ref/contrib/postgres/index","title":"django.contrib.postgres","url":"/zh-hans/6.1/ref/contrib/postgres/"}],"prev":{"docname":"ref/contrib/postgres/aggregates","title":"PostgreSQL 特有聚合函数","url":"/zh-hans/6.1/ref/contrib/postgres/aggregates/"},"next":{"docname":"ref/contrib/postgres/expressions","title":"PostgreSQL 特有查询表达式","url":"/zh-hans/6.1/ref/contrib/postgres/expressions/"},"formats":{"html":"/zh-hans/6.1/ref/contrib/postgres/constraints/","markdown":"/zh-hans/6.1/ref/contrib/postgres/constraints.md","json":"/zh-hans/6.1/ref/contrib/postgres/constraints.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/ref/contrib/postgres/constraints.txt","official":"https://docs.djangoproject.com/zh-hans/6.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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}