制約リファレンス
バージョン2.2の新機能。
このモジュールで定義されたクラスは、データベースの制約を作成します。 これらは、モデル 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 オブジェクト。
たとえば、CheckConstraint(check=Q(age__gte=18), name='age_gte_18')
は、年齢フィールドが18歳を下回らないようにします。
name
- CheckConstraint.name
制約の名前。 制約には常に一意の名前を指定する必要があります。
バージョン3.0で変更: '%(app_label)s'
と'%(class)s'
の補間が追加されました。
UniqueConstraint
- class UniqueConstraint(*, fields, name, condition=None)
- データベースに一意の制約を作成します。
fields
- UniqueConstraint.fields
制約を適用する一意の列のセットを指定するフィールド名のリスト。
たとえば、UniqueConstraint(fields=['room', 'date'], name='unique_booking')
は、各部屋を各日付に1回だけ予約できるようにします。
name
- UniqueConstraint.name
制約の名前。 制約には常に一意の名前を指定する必要があります。
バージョン3.0で変更: '%(app_label)s'
と'%(class)s'
の補間が追加されました。
condition
- UniqueConstraint.condition
制約を適用する条件を指定する Q オブジェクト。
例えば:
UniqueConstraint(fields=['user'], condition=Q(status='DRAFT'), name='unique_draft_user')
各ユーザーがドラフトを1つだけ持つようにします。
これらの条件には、 Index.condition と同じデータベース制限があります。