制約 (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 です。
例:
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 により、式やデータベース関数に対する関数的なユニーク制約を作成できます。
例:
UniqueConstraint(Lower("name").desc(), "category", name="unique_lower_name_category")
これは name フィールドの小文字の値を降順で、category フィールドの値をデフォルトの昇順でユニーク制約を作成します。
関数的なユニーク制約は Index.expressions と同じデータベース制約を持ちます。
fieldsLink to this heading
- UniqueConstraint.fieldsLink to this definition
制約を適用したい一意な列のセットを表すフィールド名のリスト。
例:
UniqueConstraint(fields=["room", "date"], name="unique_booking")
それぞれの部屋がそれぞれの日付で1度だけ予約できることを保証します。
conditionLink to this heading
- UniqueConstraint.conditionLink to this definition
制約を適用したい条件を指定する Q オブジェクト。
例:
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 です。例えば:
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) クエリにインデックスだけのスキャンを使用できます。
例:
UniqueConstraint(name="unique_booking", fields=["room", "date"], include=["full_name"])
この設定では、room と date によるフィルタリング、full_name の SELECT の際にデータをインデックスからのみ取得します。
PostgreSQL以外のデータベースでは、非キー列を持つユニーク制約は無視されます。
非キーカラムは Index.include と同じデータベース制約を持ちます。
opclassesLink to this heading
- UniqueConstraint.opclassesLink to this definition
この一意なインデックスに使用する PostgreSQL operator クラス の名前です。カスタム演算子クラスが必要な場合は、インデックスの各フィールドに1つずつ指定しなければなりません。
例:
UniqueConstraint(
name="unique_username", fields=["username"], opclasses=["varchar_pattern_ops"]
)
これは username に varchar_pattern_ops を使用する一意なインデックスを作成します。
opclasses はPostgreSQL以外のデータベースでは無視されます。
nulls_distinctLink to this heading
- UniqueConstraint.nulls_distinctLink to this definition
ユニーク制約の対象となる NULL 値を含む行を、互いに異なる行とみなすかどうかを指定します。デフォルト値は None で、ほとんどのバックエンドで True となるデータベースのデフォルト値を使用します。
例:
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 のエラーメッセージがデフォルトとなります。