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. To work around name collisions, part of thename may contain '%(applabel)s' and '%(class)s', which arereplaced, respectively, by the lowercased app label and class name of theconcrete model. For example CheckConstraint(check=Q(age__gte=18),name='%(app_label)s%(class)s_is_adult').

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.

Changed in Django 3.0:Interpolation of '%(app_label)s' and '%(class)s' was added.

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.

Changed in Django 3.0:Interpolation of '%(app_label)s' and '%(class)s' was added.

condition

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

For example:

  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.