Constraints reference

New in Django 2.2:

The classes defined in this module create database constraints. They are addedin the model Meta.constraintsoption.

Referencing built-in constraints

Constraints are defined in django.db.models.constraints, but forconvenience they're imported into django.db.models. The standardconvention is to use from django.db import models and refer to theconstraints as models.<Foo>Constraint.

Constraints in abstract base classes

You must always specify a unique name for the constraint. As such, youcannot normally specify a constraint on an abstract base class, since theMeta.constraints option isinherited by subclasses, with exactly the same values for the attributes(including name) each time. Instead, specify the constraints optionon subclasses directly, providing a unique name for each constraint.

Validation of Constraints

In general constraints are not checked during full_clean(), and donot raise ValidationErrors. Rather you'll get a database integrityerror on save(). UniqueConstraints without acondition (i.e. non-partial unique constraints)are different in this regard, in that they leverage the existingvalidate_unique() logic, and thus enable two-stage validation. Inaddition to IntegrityError on save(), ValidationError is alsoraised during model validation when the UniqueConstraint is violated.

CheckConstraint

  • class CheckConstraint(*, check, name)[源代码]
  • Creates a check constraint in the database.

check

  • CheckConstraint.check
  • A Q object that specifies the check you want the constraint toenforce.

For example, CheckConstraint(check=Q(age__gte=18), name='age_gte_18')ensures the age field is never less than 18.

name

  • CheckConstraint.name
  • The name of the constraint.

UniqueConstraint

  • class UniqueConstraint(*, fields, name, condition=None)[源代码]
  • Creates a unique constraint in the database.

fields

  • UniqueConstraint.fields
  • A list of field names that specifies the unique set of columns you want theconstraint to enforce.

For example, UniqueConstraint(fields=['room', 'date'],name='unique_booking') ensures each room can only be booked once for eachdate.

name

  • UniqueConstraint.name
  • The name of the constraint.

condition

  • UniqueConstraint.condition
  • A Q object that specifies the condition you want the constraint toenforce.

例子:

  1. UniqueConstraint(fields=['user'], condition=Q(status='DRAFT'), name='unique_draft_user')

ensures that each user only has one draft.

These conditions have the same database restrictions asIndex.condition.