Справочник по ограничениям¶
Классы, определенные в этом модуле, создают ограничения базы данных. Они добавляются в параметр модели 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.
Support for boolean Expression was added.
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') гарантирует, что каждый номер можно забронировать только один раз на каждую дату.
name¶
- UniqueConstraint.name¶
Имя ограничения. Вы всегда должны указывать уникальное имя для ограничения.
условие¶
- UniqueConstraint.condition¶
Объект Q, задающий условие, которое должно выполняться ограничением.
Например:
UniqueConstraint(fields=['user'], condition=Q(status='DRAFT'), name='unique_draft_user')
гарантирует, что у каждого пользователя будет только один черновик.
Эти условия имеют те же ограничения базы данных, что и Index.condition.
отсрочка¶
- UniqueConstraint.deferrable¶
Установите этот параметр, чтобы создать отложенное уникальное ограничение. Допустимые значения: 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>».
include¶
- UniqueConstraint.include¶
Список или кортеж имен полей, которые будут включены в покрывающий уникальный индекс как неключевые столбцы. Это позволяет использовать сканирование только по индексу для запросов, которые выбирают только включенные поля (include) и фильтруют только по уникальным полям (fields).
Например:
UniqueConstraint(name='unique_booking', fields=['room', 'date'], include=['full_name'])
позволит фильтровать по комнате и дате, а также выбирать полное_имя, извлекая данные только из индекса.
include is supported only on PostgreSQL.
Неключевые столбцы имеют те же ограничения базы данных, что и Index.include.
опклассы¶
- UniqueConstraint.opclasses¶
Имена классов операторов PostgreSQL, которые будут использоваться для этого уникального индекса. Если вам нужен собственный класс операторов, вы должны предоставить его для каждого поля в индексе.
Например:
UniqueConstraint(name='unique_username', fields=['username'], opclasses=['varchar_pattern_ops'])
создает уникальный индекс для username, используя varchar_pattern_ops.
opclasses игнорируются для баз данных, кроме PostgreSQL.