{"title":"制約 (Constraint) リファレンス","version":"5.0","locale":"ja","docname":"ref/models/constraints","url":"/ja/5.0/ref/models/constraints/","canonical":"https://djangodocs.dev/ja/5.0/ref/models/constraints/","summary":"このモジュールで定義されたクラスはデータベース制約を作成します。これらはモデルの Meta.constraints オプションで追加されます。","html":"<span id=\"constraints-reference\"></span><h1>制約 (Constraint) リファレンス<a class=\"heading-anchor\" href=\"#module-django.db.models.constraints\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>このモジュールで定義されたクラスはデータベース制約を作成します。これらはモデルの <a class=\"reference internal\" href=\"/ja/5.0/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\">Meta.constraints</code></a> オプションで追加されます。</p>\n<aside class=\"admonition-referencing-built-in-constraints admonition\" role=\"note\">\n<p class=\"admonition-title\">組み込みの制約への参照について</p>\n<p>制約は <code class=\"docutils literal notranslate\">django.db.models.constraints</code> で定義されていますが、利便性のために <a class=\"reference internal\" href=\"/ja/5.0/topics/db/models/#module-django.db.models\" title=\"django.db.models\"><code class=\"xref py py-mod docutils literal notranslate\">django.db.models</code></a> にインポートされています。標準的な規約は <code class=\"docutils literal notranslate\">from django.db import models</code> を使い、制約を <code class=\"docutils literal notranslate\">models.&lt;Foo&gt;Constraint</code> と呼ぶことです。</p>\n</aside>\n<aside class=\"admonition-constraints-in-abstract-base-classes admonition\" role=\"note\">\n<p class=\"admonition-title\">抽象基底クラスにおける制約</p>\n<p>制約には常に一意な名前を指定する必要があります。なぜなら、 <a class=\"reference internal\" href=\"/ja/5.0/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\">Meta.constraints</code></a> オプションはサブクラスに継承され、属性 (<code class=\"docutils literal notranslate\">name</code> を含む) には毎回全く同じ値が指定されるからです。名前の衝突を避けるために、名前の一部に <code class=\"docutils literal notranslate\">'%(app_label)s'</code> と <code class=\"docutils literal notranslate\">'%(class)s'</code> を含めることができます。これらはそれぞれ小文字のアプリラベルと具体的なモデルのクラス名に置き換えられます。例えば <code class=\"docutils literal notranslate\">CheckConstraint(check=Q(age__gte=18), name='%(app_label)s_%(class)s_is_adult')</code> のようになります。</p>\n</aside>\n<aside class=\"admonition-validation-of-constraints admonition\" role=\"note\">\n<p class=\"admonition-title\">制約のバリデーション</p>\n<p>制約は <a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルのバリデーション</span></a> の間にチェックされます。</p>\n</aside>\n<aside class=\"admonition-validation-of-constraints-with-jsonfield admonition\" role=\"note\">\n<p class=\"admonition-title\"><code class=\"docutils literal notranslate\">JSONField</code> の制約のバリデーション</p>\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.JSONField\" title=\"django.db.models.JSONField\"><code class=\"xref py py-class docutils literal notranslate\">JSONField</code></a> を含む制約は、キー、インデックス、およびパストランスフォームが多くのデータベース固有の注意事項を持っているため、バリデーションエラーを起こさない可能性があります。これは <a class=\"extlink-ticket reference external\" href=\"https://code.djangoproject.com/ticket/34059\">将来的に完全にサポートされる可能性があります</a> 。</p>\n<p>常に <code class=\"docutils literal notranslate\">django.db.models</code> のロガーに、 <em>&quot;Got a database error calling check() on …&quot;</em> のようなログメッセージがないことを確認し、正しく検証されていることを確認する必要があります。</p>\n</aside>\n<section id=\"baseconstraint\">\n<h2><code class=\"docutils literal notranslate\">BaseConstraint</code><a class=\"heading-anchor\" href=\"#baseconstraint\"><span class=\"visually-hidden\">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.db.models.BaseConstraint\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">BaseConstraint</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>name</em>, <em class=\"sig-param\">violation_error_code<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">violation_error_message<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.BaseConstraint\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>すべての制約の基底クラスです。サブクラスは <code class=\"docutils literal notranslate\">constraint_sql()</code>, <code class=\"docutils literal notranslate\">create_sql()</code>, <code class=\"docutils literal notranslate\">remove_sql()</code>, <code class=\"docutils literal notranslate\">validate()</code> メソッドを実装しなければなりません。</p>\n<aside class=\"version-note version-deprecated\" data-version=\"5.0\" role=\"note\">\n<p class=\"version-note-title\">Deprecated since Django 5.0</p><p><span class=\"versionmodified deprecated\">バージョン 5.0 で非推奨: </span>位置引数のサポートは非推奨になりました。</p>\n</aside>\n</dd></dl>\n\n<p>すべての制約 (constraint) に共通するパラメータは以下の通りです：</p>\n<section id=\"name\">\n<h3><code class=\"docutils literal notranslate\">name</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.db.models.BaseConstraint.name\">\n<span class=\"sig-prename descclassname\">BaseConstraint.</span><span class=\"sig-name descname\">name</span><a class=\"heading-anchor\" href=\"#django.db.models.BaseConstraint.name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>制約の名前。制約には常に一意な名前を指定する必要があります。</p>\n</section>\n<section id=\"violation-error-code\">\n<h3><code class=\"docutils literal notranslate\">violation_error_code</code><a class=\"heading-anchor\" href=\"#violation-error-code\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"5.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.0</p></aside>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.BaseConstraint.violation_error_code\">\n<span class=\"sig-prename descclassname\">BaseConstraint.</span><span class=\"sig-name descname\">violation_error_code</span><a class=\"heading-anchor\" href=\"#django.db.models.BaseConstraint.violation_error_code\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルのバリデーション</span></a> 中に <code class=\"docutils literal notranslate\">ValidationError</code> が発生した場合に使用されるエラーコードです。デフォルトは <code class=\"docutils literal notranslate\">None</code> です。</p>\n</section>\n<section id=\"violation-error-message\">\n<h3><code class=\"docutils literal notranslate\">violation_error_message</code><a class=\"heading-anchor\" href=\"#violation-error-message\"><span class=\"visually-hidden\">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.db.models.BaseConstraint.violation_error_message\">\n<span class=\"sig-prename descclassname\">BaseConstraint.</span><span class=\"sig-name descname\">violation_error_message</span><a class=\"heading-anchor\" href=\"#django.db.models.BaseConstraint.violation_error_message\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルのバリデーション</span></a> の実行中に <code class=\"docutils literal notranslate\">ValidationError</code> が発生した場合に表示されるエラーメッセージです。デフォルトは <code class=\"docutils literal notranslate\">&quot;Constraint &quot;%(name)s&quot; is violated.&quot;</code> です。</p>\n</section>\n<section id=\"validate\">\n<h3><code class=\"docutils literal notranslate\">validate()</code><a class=\"heading-anchor\" href=\"#validate\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.BaseConstraint.validate\">\n<span class=\"sig-prename descclassname\">BaseConstraint.</span><span class=\"sig-name descname\">validate</span><span class=\"sig-paren\">(</span><em class=\"sig-param\">model</em>, <em class=\"sig-param\">instance</em>, <em class=\"sig-param\">exclude<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">using<span class=\"o\">=</span><span class=\"default_value\">DEFAULT_DB_ALIAS</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.BaseConstraint.validate\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>モデル <code class=\"docutils literal notranslate\">model</code> で定義された制約がインスタンス <code class=\"docutils literal notranslate\">instance</code> で守られているかどうかを検証します。これは、制約が守られていることを確認するために、データベースに対してクエリを実行します。制約を検証するために <code class=\"docutils literal notranslate\">exclude</code> リストのフィールドが必要な場合、制約は無視されます。</p>\n<p>制約に違反した場合は <code class=\"docutils literal notranslate\">ValidationError</code> を発生させます。</p>\n<p>このメソッドはサブクラスで実装する必要があります。</p>\n</section>\n</section>\n<section id=\"checkconstraint\">\n<h2><code class=\"docutils literal notranslate\">CheckConstraint</code><a class=\"heading-anchor\" href=\"#checkconstraint\"><span class=\"visually-hidden\">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.db.models.CheckConstraint\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">CheckConstraint</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"keyword-only-separator o\"><abbr title=\"Keyword-only parameters separator (PEP 3102)\">*</abbr></span></em>, <em class=\"sig-param\">check</em>, <em class=\"sig-param\">name</em>, <em class=\"sig-param\">violation_error_code<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">violation_error_message<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.CheckConstraint\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>データベースにチェック制約を作成します。</p>\n</dd></dl>\n\n<section id=\"check\">\n<h3><code class=\"docutils literal notranslate\">check</code><a class=\"heading-anchor\" href=\"#check\"><span class=\"visually-hidden\">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.db.models.CheckConstraint.check\">\n<span class=\"sig-prename descclassname\">CheckConstraint.</span><span class=\"sig-name descname\">check</span><a class=\"heading-anchor\" href=\"#django.db.models.CheckConstraint.check\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>適用したい制約をチェックする <a class=\"reference internal\" href=\"/ja/5.0/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\">Q</code></a> オブジェクトまたは真偽値 <a class=\"reference internal\" href=\"/ja/5.0/ref/models/expressions/#django.db.models.Expression\" title=\"django.db.models.Expression\"><code class=\"xref py py-class docutils literal notranslate\">Expression</code></a> 。</p>\n<p>例えば、<code class=\"docutils literal notranslate\">CheckConstraint(check=Q(age__gte=18), name='age_gte_18')</code> は年齢フィールドが18歳未満にならないようにします。</p>\n<aside class=\"admonition-expression-order admonition\" role=\"note\">\n<p class=\"admonition-title\">式の順序</p>\n<p><code class=\"docutils literal notranslate\">Q</code> の引数の順番は必ずしも保持されるわけではありませんが、 <code class=\"docutils literal notranslate\">Q</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>CheckConstraint<span class=\"p\">(</span>\n    check<span class=\"o\">=</span>Q<span class=\"p\">(</span>age__gte<span class=\"o\">=</span><span class=\"mi\">18</span><span class=\"p\">)</span> <span class=\"o\">&amp;</span> Q<span class=\"p\">(</span>expensive_check<span class=\"o\">=</span>condition<span class=\"p\">),</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;age_gte_18_and_others&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n<aside class=\"admonition-oracle admonition\" role=\"note\">\n<p class=\"admonition-title\">Oracle</p>\n<p>OracleでNULL許容フィールドに対するチェックを行う場合、<a class=\"reference internal\" href=\"#django.db.models.BaseConstraint.validate\" title=\"django.db.models.BaseConstraint.validate\"><code class=\"xref py py-meth docutils literal notranslate\">validate()</code></a> がチェック制約の検証と同様に動作するためには、<code class=\"docutils literal notranslate\">NULL</code> 値を許容する条件を含める必要があります。例えば、<code class=\"docutils literal notranslate\">age</code> がNULL許容フィールドの場合、以下のようにします：</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>CheckConstraint<span class=\"p\">(</span>check<span class=\"o\">=</span>Q<span class=\"p\">(</span>age__gte<span class=\"o\">=</span><span class=\"mi\">18</span><span class=\"p\">)</span> <span class=\"o\">|</span> Q<span class=\"p\">(</span>age__isnull<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;age_gte_18&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n</aside>\n</section>\n</section>\n<section id=\"uniqueconstraint\">\n<h2><code class=\"docutils literal notranslate\">UniqueConstraint</code><a class=\"heading-anchor\" href=\"#uniqueconstraint\"><span class=\"visually-hidden\">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.db.models.UniqueConstraint\">\n<em class=\"property\"><span class=\"k\">class</span> </em><span class=\"sig-name descname\">UniqueConstraint</span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"o\">*</span>expressions</em>, <em class=\"sig-param\">fields<span class=\"o\">=</span><span class=\"default_value\">()</span></em>, <em class=\"sig-param\">name<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">condition<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">deferrable<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">include<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">opclasses<span class=\"o\">=</span><span class=\"default_value\">()</span></em>, <em class=\"sig-param\">nulls_distinct<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">violation_error_code<span class=\"o\">=</span><span class=\"default_value\">None</span></em>, <em class=\"sig-param\">violation_error_message<span class=\"o\">=</span><span class=\"default_value\">None</span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>データベースにユニーク制約（一意性制約）を作成します。</p>\n</dd></dl>\n\n<section id=\"expressions\">\n<h3><code class=\"docutils literal notranslate\">expressions</code><a class=\"heading-anchor\" href=\"#expressions\"><span class=\"visually-hidden\">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.db.models.UniqueConstraint.expressions\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">expressions</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.expressions\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>位置引数 <code class=\"docutils literal notranslate\">*expressions</code> により、式やデータベース関数に対する関数的なユニーク制約を作成できます。</p>\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>UniqueConstraint<span class=\"p\">(</span>Lower<span class=\"p\">(</span><span class=\"s2\">&quot;name&quot;</span><span class=\"p\">)</span><span class=\"o\">.</span>desc<span class=\"p\">(),</span> <span class=\"s2\">&quot;category&quot;</span><span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_lower_name_category&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>これは <code class=\"docutils literal notranslate\">name</code> フィールドの小文字の値を降順で、<code class=\"docutils literal notranslate\">category</code> フィールドの値をデフォルトの昇順でユニーク制約を作成します。</p>\n<p>関数的なユニーク制約は <a class=\"reference internal\" href=\"/ja/5.0/ref/models/indexes/#django.db.models.Index.expressions\" title=\"django.db.models.Index.expressions\"><code class=\"xref py py-attr docutils literal notranslate\">Index.expressions</code></a> と同じデータベース制約を持ちます。</p>\n</section>\n<section id=\"fields\">\n<h3><code class=\"docutils literal notranslate\">fields</code><a class=\"heading-anchor\" href=\"#fields\"><span class=\"visually-hidden\">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.db.models.UniqueConstraint.fields\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">fields</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.fields\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>制約を適用したい一意な列のセットを表すフィールド名のリスト。</p>\n<p>例えば、<code class=\"docutils literal notranslate\">UniqueConstraint(fields=['room', 'date'], name='unique_booking')</code> は各 room が各 date で一度しか予約できないようにします。</p>\n</section>\n<section id=\"condition\">\n<h3><code class=\"docutils literal notranslate\">condition</code><a class=\"heading-anchor\" href=\"#condition\"><span class=\"visually-hidden\">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.db.models.UniqueConstraint.condition\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">condition</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.condition\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>制約を適用したい条件を指定する <a class=\"reference internal\" href=\"/ja/5.0/ref/models/querysets/#django.db.models.Q\" title=\"django.db.models.Q\"><code class=\"xref py py-class docutils literal notranslate\">Q</code></a> オブジェクト。</p>\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>UniqueConstraint<span class=\"p\">(</span>fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;user&quot;</span><span class=\"p\">],</span> condition<span class=\"o\">=</span>Q<span class=\"p\">(</span>status<span class=\"o\">=</span><span class=\"s2\">&quot;DRAFT&quot;</span><span class=\"p\">),</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_draft_user&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>これは、各ユーザーが1つの DRAFT しか持たないことを保証します。</p>\n<p>これらの condition は <a class=\"reference internal\" href=\"/ja/5.0/ref/models/indexes/#django.db.models.Index.condition\" title=\"django.db.models.Index.condition\"><code class=\"xref py py-attr docutils literal notranslate\">Index.condition</code></a> と同じデータベースの制限を持ちます。</p>\n</section>\n<section id=\"deferrable\">\n<h3><code class=\"docutils literal notranslate\">deferrable</code><a class=\"heading-anchor\" href=\"#deferrable\"><span class=\"visually-hidden\">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.db.models.UniqueConstraint.deferrable\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">deferrable</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.deferrable\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>このパラメータを指定すると、遅延可能なユニーク制約を作成できます。使用可能な値は <code class=\"docutils literal notranslate\">Deferrable.DEFERRED</code> または <code class=\"docutils literal notranslate\">Deferrable.IMMEDIATE</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=\"nn\">django.db.models</span> <span class=\"kn\">import</span> Deferrable<span class=\"p\">,</span> UniqueConstraint\n\nUniqueConstraint<span class=\"p\">(</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_order&quot;</span><span class=\"p\">,</span>\n    fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;order&quot;</span><span class=\"p\">],</span>\n    deferrable<span class=\"o\">=</span>Deferrable<span class=\"o\">.</span>DEFERRED<span class=\"p\">,</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>デフォルトでは、制約は遅延 (DEFERRED) されません。遅延された制約は、トランザクションが終了するまで実行されません。即時 (IMMEDIATE) 制約は、すべてのコマンドの直後に実行されます。</p>\n<aside class=\"admonition-mysql-mariadb-and-sqlite admonition\" role=\"note\">\n<p class=\"admonition-title\">MySQL, MariaDB, SQLite の場合</p>\n<p>MySQL、MariaDB、SQLite のいずれも遅延ユニーク制約をサポートしていないため、遅延ユニーク制約は無視されます。</p>\n</aside>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</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\">include</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.db.models.UniqueConstraint.include\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">include</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.include\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>ユニークなカバリングインデックス (covering index) に非キー列として含めるフィールド名のリストまたはタプル。これにより、include されたフィールドだけを SELECT するクエリと、 (<a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint.include\" title=\"django.db.models.UniqueConstraint.include\"><code class=\"xref py py-attr docutils literal notranslate\">include</code></a>)、ユニークなフィールドだけでフィルタリングする(<a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint.fields\" title=\"django.db.models.UniqueConstraint.fields\"><code class=\"xref py py-attr docutils literal notranslate\">fields</code></a>) クエリにインデックスだけのスキャンを使用できます。</p>\n<p>例:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>UniqueConstraint<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_booking&quot;</span><span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;room&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;date&quot;</span><span class=\"p\">],</span> include<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;full_name&quot;</span><span class=\"p\">])</span>\n</code></pre></div>\n<p>この設定では、<code class=\"docutils literal notranslate\">room</code> と <code class=\"docutils literal notranslate\">date</code> によるフィルタリング、<code class=\"docutils literal notranslate\">full_name</code> の SELECT の際にデータをインデックスからのみ取得します。</p>\n<p>PostgreSQL以外のデータベースでは、非キー列を持つユニーク制約は無視されます。</p>\n<p>非キーカラムは <a class=\"reference internal\" href=\"/ja/5.0/ref/models/indexes/#django.db.models.Index.include\" title=\"django.db.models.Index.include\"><code class=\"xref py py-attr docutils literal notranslate\">Index.include</code></a> と同じデータベース制約を持ちます。</p>\n</section>\n<section id=\"opclasses\">\n<h3><code class=\"docutils literal notranslate\">opclasses</code><a class=\"heading-anchor\" href=\"#opclasses\"><span class=\"visually-hidden\">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.db.models.UniqueConstraint.opclasses\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">opclasses</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.opclasses\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>この一意なインデックスに使用する <a class=\"reference external\" href=\"https://www.postgresql.org/docs/current/indexes-opclass.html\">PostgreSQL operator クラス</a> の名前です。カスタム演算子クラスが必要な場合は、インデックスの各フィールドに1つずつ指定しなければなりません。</p>\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>UniqueConstraint<span class=\"p\">(</span>\n    name<span class=\"o\">=</span><span class=\"s2\">&quot;unique_username&quot;</span><span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;username&quot;</span><span class=\"p\">],</span> opclasses<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;varchar_pattern_ops&quot;</span><span class=\"p\">]</span>\n<span class=\"p\">)</span>\n</code></pre></div>\n<p>これは <code class=\"docutils literal notranslate\">username</code> に <code class=\"docutils literal notranslate\">varchar_pattern_ops</code> を使用する一意なインデックスを作成します。</p>\n<p><code class=\"docutils literal notranslate\">opclasses</code> はPostgreSQL以外のデータベースでは無視されます。</p>\n</section>\n<section id=\"nulls-distinct\">\n<h3><code class=\"docutils literal notranslate\">nulls_distinct</code><a class=\"heading-anchor\" href=\"#nulls-distinct\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"5.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.0</p></aside>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.UniqueConstraint.nulls_distinct\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">nulls_distinct</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.nulls_distinct\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>ユニーク制約の対象となる <code class=\"docutils literal notranslate\">NULL</code> 値を含む行を、互いに異なる行とみなすかどうかを指定します。デフォルト値は <code class=\"docutils literal notranslate\">None</code> で、ほとんどのバックエンドで <code class=\"docutils literal notranslate\">True</code> となるデータベースのデフォルト値を使用します。</p>\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>UniqueConstraint<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s2\">&quot;ordering&quot;</span><span class=\"p\">,</span> fields<span class=\"o\">=</span><span class=\"p\">[</span><span class=\"s2\">&quot;ordering&quot;</span><span class=\"p\">],</span> nulls_distinct<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>これは、 <code class=\"docutils literal notranslate\">ordering</code> カラムに <code class=\"docutils literal notranslate\">NULL</code> 値を格納できるのは1行だけというユニーク制約を作成します。</p>\n<p><code class=\"docutils literal notranslate\">nulls_distinct</code> によるユニーク制約は、PostgreSQL 15+ 以外のデータベースでは無視されます。</p>\n</section>\n<section id=\"id1\">\n<h3><code class=\"docutils literal notranslate\">violation_error_code</code><a class=\"heading-anchor\" href=\"#id1\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<aside class=\"version-note version-added\" data-version=\"5.0\" role=\"note\">\n<p class=\"version-note-title\">New in Django 5.0</p></aside>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.db.models.UniqueConstraint.violation_error_code\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">violation_error_code</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.violation_error_code\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルのバリデーション</span></a> 中に <code class=\"docutils literal notranslate\">ValidationError</code> が発生した場合に使用されるエラーコードです。デフォルトは <code class=\"docutils literal notranslate\">None</code> です。</p>\n<p>このコードは、<a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint.fields\" title=\"django.db.models.UniqueConstraint.fields\"><code class=\"xref py py-attr docutils literal notranslate\">fields</code></a> を持ち、かつ <a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint.condition\" title=\"django.db.models.UniqueConstraint.condition\"><code class=\"xref py py-attr docutils literal notranslate\">condition</code></a> を持たない <a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint\" title=\"django.db.models.UniqueConstraint\"><code class=\"xref py py-class docutils literal notranslate\">UniqueConstraint</code></a> には <em>使用されません</em> 。このような <a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint\" title=\"django.db.models.UniqueConstraint\"><code class=\"xref py py-class docutils literal notranslate\">UniqueConstraint</code></a> は、<a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\">Field.unique</code></a> や <a class=\"reference internal\" href=\"/ja/5.0/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\">Meta.unique_together</code></a> で定義された制約と同じエラーコードを持ちます。</p>\n</section>\n<section id=\"id2\">\n<h3><code class=\"docutils literal notranslate\">violation_error_message</code><a class=\"heading-anchor\" href=\"#id2\"><span class=\"visually-hidden\">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.db.models.UniqueConstraint.violation_error_message\">\n<span class=\"sig-prename descclassname\">UniqueConstraint.</span><span class=\"sig-name descname\">violation_error_message</span><a class=\"heading-anchor\" href=\"#django.db.models.UniqueConstraint.violation_error_message\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p><a class=\"reference internal\" href=\"/ja/5.0/ref/models/instances/#validating-objects\"><span class=\"std std-ref\">モデルのバリデーション</span></a> 中に <code class=\"docutils literal notranslate\">ValidationError</code> が発生した場合に使用されるエラーメッセージです。デフォルトは <a class=\"reference internal\" href=\"#django.db.models.BaseConstraint.violation_error_message\" title=\"django.db.models.BaseConstraint.violation_error_message\"><code class=\"xref py py-attr docutils literal notranslate\">BaseConstraint.violation_error_message</code></a> です。</p>\n<p>このメッセージは、<a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint.fields\" title=\"django.db.models.UniqueConstraint.fields\"><code class=\"xref py py-attr docutils literal notranslate\">fields</code></a> を持ち、かつ <a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint.condition\" title=\"django.db.models.UniqueConstraint.condition\"><code class=\"xref py py-attr docutils literal notranslate\">condition</code></a> を持たない <a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint\" title=\"django.db.models.UniqueConstraint\"><code class=\"xref py py-class docutils literal notranslate\">UniqueConstraint</code></a> には <em>使用されません</em> 。このような <a class=\"reference internal\" href=\"#django.db.models.UniqueConstraint\" title=\"django.db.models.UniqueConstraint\"><code class=\"xref py py-class docutils literal notranslate\">UniqueConstraint</code></a> は、<a class=\"reference internal\" href=\"/ja/5.0/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\">Field.unique</code></a> や <a class=\"reference internal\" href=\"/ja/5.0/ref/models/options/#django.db.models.Options.constraints\" title=\"django.db.models.Options.constraints\"><code class=\"xref py py-attr docutils literal notranslate\">Meta.unique_together</code></a> で定義された制約と同じメッセージを表示します。</p>\n</section>\n</section>","rootId":"module-django.db.models.constraints","toc":[{"title":"BaseConstraint","anchor":"baseconstraint","children":[{"title":"name","anchor":"name","children":[]},{"title":"violation_error_code","anchor":"violation-error-code","children":[]},{"title":"violation_error_message","anchor":"violation-error-message","children":[]},{"title":"validate()","anchor":"validate","children":[]}]},{"title":"CheckConstraint","anchor":"checkconstraint","children":[{"title":"check","anchor":"check","children":[]}]},{"title":"UniqueConstraint","anchor":"uniqueconstraint","children":[{"title":"expressions","anchor":"expressions","children":[]},{"title":"fields","anchor":"fields","children":[]},{"title":"condition","anchor":"condition","children":[]},{"title":"deferrable","anchor":"deferrable","children":[]},{"title":"include","anchor":"include","children":[]},{"title":"opclasses","anchor":"opclasses","children":[]},{"title":"nulls_distinct","anchor":"nulls-distinct","children":[]},{"title":"violation_error_code","anchor":"id1","children":[]},{"title":"violation_error_message","anchor":"id2","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API リファレンス","url":"/ja/5.0/ref/"},{"docname":"ref/models/index","title":"モデル","url":"/ja/5.0/ref/models/"}],"prev":{"docname":"ref/models/indexes","title":"モデル index リファレンス","url":"/ja/5.0/ref/models/indexes/"},"next":{"docname":"ref/models/meta","title":"モデル _meta API","url":"/ja/5.0/ref/models/meta/"},"formats":{"html":"/ja/5.0/ref/models/constraints/","markdown":"/ja/5.0/ref/models/constraints.md","json":"/ja/5.0/ref/models/constraints.json"},"source":"https://github.com/django/django/blob/stable/5.0.x/docs/ref/models/constraints.txt","official":"https://docs.djangoproject.com/ja/5.0/ref/models/constraints/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}