• 3.2
  • 5.0
  • 6.1
  • Версия документации: 3.1

Справочник по ограничениям

Классы, определенные в этом модуле, создают ограничения базы данных. Они добавляются в параметр модели Meta.constraints.

Ссылки на встроенные ограничения

Ограничения определены в django.db.models.constraints, но для удобства они импортированы в django.db.models. Стандартным соглашением является использование моделей импорта из django.db и обращение к ограничениям как «модели.<Foo>Constraint».

Ограничения в абстрактных базовых классах

You must always specify a unique name for the constraint. As such, you cannot normally specify a constraint on an abstract base class, since the Meta.constraints option is inherited by subclasses, with exactly the same values for the attributes (including name) each time. To work around name collisions, part of the name may contain '%(app_label)s' and '%(class)s', which are replaced, respectively, by the lowercased app label and class name of the concrete model. For example CheckConstraint(check=Q(age__gte=18), name='%(app_label)s_%(class)s_is_adult').

Проверка ограничений

In general constraints are not checked during full_clean(), and do not raise ValidationErrors. Rather you’ll get a database integrity error on save(). UniqueConstraints without a condition (i.e. non-partial unique constraints) are different in this regard, in that they leverage the existing validate_unique() logic, and thus enable two-stage validation. In addition to IntegrityError on save(), ValidationError is also raised during model validation when the UniqueConstraint is violated.

CheckConstraint

class CheckConstraint(*, check, name)

Создает проверочное ограничение в базе данных.

black

CheckConstraint.check

A Q object or boolean Expression that specifies the check you want the constraint to enforce.

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

Changed in Django 3.1:

Support for boolean Expression was added.

name

CheckConstraint.name

Имя ограничения. Вы всегда должны указывать уникальное имя для ограничения.

Changed in Django 3.0:

Interpolation of '%(app_label)s' and '%(class)s' was added.

UniqueConstraint

class UniqueConstraint(*, fields, name, condition=None, deferrable=None)

Создает уникальное ограничение в базе данных.

fields

UniqueConstraint.fields

Список имен полей, определяющий уникальный набор столбцов, к которым должно применяться ограничение.

Например, UniqueConstraint(fields=['room', 'date'], name='unique_booking') гарантирует, что каждый номер можно забронировать только один раз на каждую дату.

name

UniqueConstraint.name

Имя ограничения. Вы всегда должны указывать уникальное имя для ограничения.

Changed in Django 3.0:

Interpolation of '%(app_label)s' and '%(class)s' was added.

условие

UniqueConstraint.condition

Объект Q, задающий условие, которое должно выполняться ограничением.

Например:

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

гарантирует, что у каждого пользователя будет только один черновик.

Эти условия имеют те же ограничения базы данных, что и Index.condition.

отсрочка

UniqueConstraint.deferrable
New in Django 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.

Deferrable unique constraints are ignored on MySQL, MariaDB, and SQLite as neither supports them.

Предупреждение

Отложенные ограничения уникальности могут привести к «снижению производительности <https://www.postgresql.org/docs/current/sql-createtable.html#id-1.9.3.85.9.4>».

Back to Top