制約リファレンス—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/ref/models/constraints
移動先:案内検索

制約リファレンス

このモジュールで定義されたクラスは、データベースの制約を作成します。 これらは、モデル 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'])

インデックスからのみデータをフェッチしながら、roomdateでフィルタリングを許可し、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以外のデータベースでは無視されます。