制約 (Constraint) リファレンスLink to this heading

このモジュールで定義されたクラスはデータベース制約を作成します。これらはモデルの Meta.constraints オプションで追加されます。

BaseConstraintLink to this heading

class BaseConstraint(*name, violation_error_code=None, violation_error_message=None)Link to this definition

すべての制約の基底クラスです。サブクラスは constraint_sql(), create_sql(), remove_sql(), validate() メソッドを実装しなければなりません。

すべての制約 (constraint) に共通するパラメータは以下の通りです:

nameLink to this heading

BaseConstraint.nameLink to this definition

制約の名前。制約には常に一意な名前を指定する必要があります。

violation_error_codeLink to this heading

BaseConstraint.violation_error_codeLink to this definition

モデルのバリデーション 中に ValidationError が発生した場合に使用されるエラーコードです。デフォルトは None です。

violation_error_messageLink to this heading

BaseConstraint.violation_error_messageLink to this definition

モデルのバリデーション の実行中に ValidationError が発生した場合に表示されるエラーメッセージです。デフォルトは "Constraint "%(name)s" is violated." です。

validate()Link to this heading

BaseConstraint.validate(model, instance, exclude=None, using=DEFAULT_DB_ALIAS)Link to this definition

モデル model で定義された制約がインスタンス instance で守られているかどうかを検証します。これは、制約が守られていることを確認するために、データベースに対してクエリを実行します。制約を検証するために exclude リストのフィールドが必要な場合、制約は無視されます。

制約に違反した場合は ValidationError を発生させます。

このメソッドはサブクラスで実装する必要があります。

CheckConstraintLink to this heading

class CheckConstraint(*, condition, name, violation_error_code=None, violation_error_message=None)Link to this definition

データベースにチェック制約を作成します。

conditionLink to this heading

CheckConstraint.conditionLink to this definition

制約が強制する条件チェックを指定する Q オブジェクトまたは真偽値の Expression です。

例:

Code
CheckConstraint(condition=Q(age__gte=18), name="age_gte_18")

年齢フィールドが18未満にならないことを保証します。

UniqueConstraintLink to this heading

class UniqueConstraint(*expressions, fields=(), name, condition=None, deferrable=None, include=None, opclasses=(), nulls_distinct=None, violation_error_code=None, violation_error_message=None)Link to this definition

Creates a uniqueness guarantee in the database, enforced by either a unique constraint or a unique index depending on the options used.

expressionsLink to this heading

UniqueConstraint.expressionsLink to this definition

位置引数 *expressions により、式やデータベース関数に対する関数的なユニーク制約を作成できます。

例:

Code
UniqueConstraint(Lower("name").desc(), "category", name="unique_lower_name_category")

これは name フィールドの小文字の値を降順で、category フィールドの値をデフォルトの昇順でユニーク制約を作成します。

関数的なユニーク制約は Index.expressions と同じデータベース制約を持ちます。

fieldsLink to this heading

UniqueConstraint.fieldsLink to this definition

制約を適用したい一意な列のセットを表すフィールド名のリスト。

例:

Code
UniqueConstraint(fields=["room", "date"], name="unique_booking")

それぞれの部屋がそれぞれの日付で1度だけ予約できることを保証します。

conditionLink to this heading

UniqueConstraint.conditionLink to this definition

制約を適用したい条件を指定する Q オブジェクト。

例:

Code
UniqueConstraint(fields=["user"], condition=Q(status="DRAFT"), name="unique_draft_user")

これは、各ユーザーが1つの DRAFT しか持たないことを保証します。

これらの condition は Index.condition と同じデータベースの制限を持ちます。

deferrableLink to this heading

UniqueConstraint.deferrableLink to this definition

このパラメータを指定すると、遅延可能なユニーク制約を作成できます。使用可能な値は Deferrable.DEFERRED または Deferrable.IMMEDIATE です。例えば:

Code
from django.db.models import Deferrable, UniqueConstraint

UniqueConstraint(
    name="unique_order",
    fields=["order"],
    deferrable=Deferrable.DEFERRED,
)

デフォルトでは、制約は遅延 (DEFERRED) されません。遅延された制約は、トランザクションが終了するまで実行されません。即時 (IMMEDIATE) 制約は、すべてのコマンドの直後に実行されます。

Unique constraints with condition, include, opclasses, or expressions may be implemented as unique indexes rather than unique constraints. In that case, deferrable cannot be set.

includeLink to this heading

UniqueConstraint.includeLink to this definition

ユニークなカバリングインデックス (covering index) に非キー列として含めるフィールド名のリストまたはタプル。これにより、include されたフィールドだけを SELECT するクエリと、 (include)、ユニークなフィールドだけでフィルタリングする(fields) クエリにインデックスだけのスキャンを使用できます。

例:

Code
UniqueConstraint(name="unique_booking", fields=["room", "date"], include=["full_name"])

この設定では、roomdate によるフィルタリング、full_name の SELECT の際にデータをインデックスからのみ取得します。

PostgreSQL以外のデータベースでは、非キー列を持つユニーク制約は無視されます。

非キーカラムは Index.include と同じデータベース制約を持ちます。

opclassesLink to this heading

UniqueConstraint.opclassesLink to this definition

この一意なインデックスに使用する PostgreSQL operator クラス の名前です。カスタム演算子クラスが必要な場合は、インデックスの各フィールドに1つずつ指定しなければなりません。

例:

Code
UniqueConstraint(
    name="unique_username", fields=["username"], opclasses=["varchar_pattern_ops"]
)

これは usernamevarchar_pattern_ops を使用する一意なインデックスを作成します。

opclasses はPostgreSQL以外のデータベースでは無視されます。

nulls_distinctLink to this heading

UniqueConstraint.nulls_distinctLink to this definition

ユニーク制約の対象となる NULL 値を含む行を、互いに異なる行とみなすかどうかを指定します。デフォルト値は None で、ほとんどのバックエンドで True となるデータベースのデフォルト値を使用します。

例:

Code
UniqueConstraint(name="ordering", fields=["ordering"], nulls_distinct=False)

これは、 ordering カラムに NULL 値を格納できるのは1行だけというユニーク制約を作成します。

Unique constraints with nulls_distinct are ignored for databases besides PostgreSQL.

violation_error_codeLink to this heading

UniqueConstraint.violation_error_codeLink to this definition

model validation 中に ValidationError が発生した場合に使用されるエラーコードです。

UniqueConstraint.condition が設定されているか、 UniqueConstraint.fields が設定されていない場合、デフォルトで BaseConstraint.violation_error_code になります。

UniqueConstraint.condition を伴わずに UniqueConstraint.fields が設定された場合、フィールドが複数あるときは Meta.unique_together のエラーコードがデフォルトとなり、フィールドが単一のときは Field.unique のエラーコードがデフォルトとなります。

violation_error_messageLink to this heading

UniqueConstraint.violation_error_messageLink to this definition

model validation 中に ValidationError が発生した場合に使用されるエラーメッセージです。

UniqueConstraint.condition が設定されているか、 UniqueConstraint.fields が設定されていない場合、 BaseConstraint.violation_error_message がデフォルトになります。

UniqueConstraint.condition を伴わずに UniqueConstraint.fields が設定された場合、フィールドが複数あるときは Meta.unique_together のエラーメッセージがデフォルトとなり、フィールドが単一のときは Field.unique のエラーメッセージがデフォルトとなります。