制約リファレンス
このモジュールで定義されたクラスは、データベースの制約を作成します。 これらは、モデル Meta.constraints オプションに追加されます。
組み込みの制約を参照する
制約はdjango.db.models.constraints
で定義されていますが、便宜上、 django.db.models にインポートされています。 標準の規則では、from django.db import models
を使用し、制約をmodels.<Foo>Constraint
と呼びます。
抽象基本クラスの制約
制約には常に一意の名前を指定する必要があります。 そのため、 Meta.constraints オプションはサブクラスに継承され、属性(name
を含む)の値はそれぞれまったく同じであるため、通常、抽象基本クラスに制約を指定することはできません。時間。 名前の衝突を回避するために、名前の一部に'%(app_label)s'
と'%(class)s'
が含まれている場合があります。これらは、それぞれ小文字のアプリラベルと具象モデルのクラス名に置き換えられています。 たとえば、CheckConstraint(check=Q(age__gte=18), name='%(app_label)s_%(class)s_is_adult')
。
制約の検証
一般に、制約はfull_clean()
の間に not チェックされ、ValidationError
を上げません。 むしろ、save()
でデータベース整合性エラーが発生します。 条件なしのUniqueConstraint
s (つまり、 非部分的な一意の制約)は、既存のvalidate_unique()
ロジックを活用するため、2段階の検証が可能になるという点で異なります。 save()
のIntegrityError
に加えて、UniqueConstraint
に違反した場合、モデル検証中にValidationError
も発生します。
CheckConstraint
- class CheckConstraint(*, check, name)
- データベースにチェック制約を作成します。
check
- CheckConstraint.check
制約に適用するチェックを指定する Q オブジェクトまたはブール Expression 。
たとえば、CheckConstraint(check=Q(age__gte=18), name='age_gte_18')
は、年齢フィールドが18歳を下回らないようにします。
バージョン3.1で変更:ブール式のサポートが追加されました。
name
- CheckConstraint.name
制約の名前。 制約には常に一意の名前を指定する必要があります。
UniqueConstraint
- class UniqueConstraint(*, fields, name, condition=None, deferrable=None, include=None, opclasses=())
- データベースに一意の制約を作成します。
fields
- UniqueConstraint.fields
制約を適用する一意の列のセットを指定するフィールド名のリスト。
たとえば、UniqueConstraint(fields=['room', 'date'], name='unique_booking')
は、各部屋を各日付に1回だけ予約できるようにします。
name
- UniqueConstraint.name
制約の名前。 制約には常に一意の名前を指定する必要があります。
condition
- UniqueConstraint.condition
制約を適用する条件を指定する Q オブジェクト。
例えば:
UniqueConstraint(fields=['user'], condition=Q(status='DRAFT'), name='unique_draft_user')
各ユーザーがドラフトを1つだけ持つようにします。
これらの条件には、 Index.condition と同じデータベース制限があります。
deferrable
- UniqueConstraint.deferrable
バージョン3.1の新機能。
このパラメーターを設定して、延期可能な一意性制約を作成します。 許容値はDeferrable.DEFERRED
またはDeferrable.IMMEDIATE
です。 例えば:
from django.db.models import Deferrable, UniqueConstraint
UniqueConstraint(
name='unique_order',
fields=['order'],
deferrable=Deferrable.DEFERRED,
)
デフォルトでは、制約は延期されません。 遅延制約は、トランザクションが終了するまで適用されません。 すべてのコマンドの直後に、即時制約が適用されます。
MySQL、MariaDB、およびSQLite。
MySQL、MariaDB、およびSQLiteはどちらもサポートしていないため、延期可能な一意の制約は無視されます。
include
- UniqueConstraint.include
バージョン3.2の新機能。
非キー列としてカバーする一意のインデックスに含まれるフィールドの名前のリストまたはタプル。 これにより、含まれるフィールドのみを選択し( include )、一意のフィールドのみでフィルタリングする( fields )クエリにインデックスのみのスキャンを使用できます。
例えば:
UniqueConstraint(name='unique_booking', fields=['room', 'date'], include=['full_name'])
インデックスからのみデータをフェッチしながら、room
とdate
でフィルタリングを許可し、full_name
も選択します。
include
はPostgreSQLでのみサポートされています。
非キー列には、 Index.include と同じデータベース制限があります。
opclasses
- UniqueConstraint.opclasses
バージョン3.2の新機能。
この一意のインデックスに使用する PostgreSQLオペレータークラスの名前。 カスタム演算子クラスが必要な場合は、インデックスの各フィールドに1つずつ指定する必要があります。
例えば:
UniqueConstraint(name='unique_username', fields=['username'], opclasses=['varchar_pattern_ops'])
varchar_pattern_ops
を使用して、username
に一意のインデックスを作成します。
opclasses
は、PostgreSQL以外のデータベースでは無視されます。