Ссылка на ограничения¶
Классы, определенные в этом модуле, создают ограничения базы данных. Они добавляются в опцию модели 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').
Валидация ограничений
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)
and expressions (i.e. non-functional 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)[исходный код]¶ Создает контрольное ограничение в базе данных.
check¶
-
CheckConstraint.check¶
Объект Q или булево Expression, который определяет проверку, которую вы хотите, чтобы ограничение выполняло.
Например, CheckConstraint(check=Q(age__gte=18), name='age_gte_18') гарантирует, что поле возраст никогда не будет меньше 18.
UniqueConstraint¶
-
class
UniqueConstraint(*expressions, fields=(), name=None, condition=None, deferrable=None, include=None, opclasses=())[исходный код]¶ Создает уникальное ограничение в базе данных.
expressions¶
-
UniqueConstraint.expressions¶
Позиционный аргумент *expressions позволяет создавать функциональные уникальные ограничения на выражения и функции базы данных.
Например:
UniqueConstraint(Lower('name').desc(), 'category', name='unique_lower_name_category')
создает уникальное ограничение на строчные значения поля name в порядке убывания и поля category в порядке возрастания по умолчанию.
Функциональные уникальные ограничения имеют те же ограничения базы данных, что и Index.expressions.
fields¶
-
UniqueConstraint.fields¶
Список имен полей, определяющий уникальный набор столбцов, на которые необходимо наложить ограничение.
Например, UniqueConstraint(fields=['room', 'date'], name='unique_booking') гарантирует, что каждый номер может быть забронирован только один раз на каждую дату.
name¶
-
UniqueConstraint.name¶
Имя ограничения. Вы всегда должны указывать уникальное имя для ограничения.
condition¶
-
UniqueConstraint.condition¶
Объект Q, который определяет условие, которое вы хотите, чтобы ограничение выполнялось.
Например:
UniqueConstraint(fields=['user'], condition=Q(status='DRAFT'), name='unique_draft_user')
гарантирует, что у каждого пользователя будет только один черновик.
Эти условия имеют те же ограничения базы данных, что и Index.condition.
deferrable¶
-
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.
Откладываемые уникальные ограничения игнорируются в MySQL, MariaDB и SQLite, поскольку ни один из них их не поддерживает.
Предупреждение
Отложенные уникальные ограничения могут привести к ошибке performance penalty.
include¶
-
UniqueConstraint.include¶
Список или кортеж имен полей, которые должны быть включены в охватывающий уникальный индекс в качестве неключевых столбцов. Это позволяет использовать сканирование только по индексу для запросов, которые выбирают только включенные поля (include) и фильтруют только по уникальным полям (fields).
Например:
UniqueConstraint(name='unique_booking', fields=['room', 'date'], include=['full_name'])
позволит фильтровать по room и date, также выбирая full_name, при этом получая данные только из индекса.
include поддерживается только в PostgreSQL.
Столбцы без ключей имеют те же ограничения базы данных, что и Index.include.
opclasses¶
-
UniqueConstraint.opclasses¶
Имена операторов PostgreSQL operator classes для использования для этого уникального индекса. Если вам требуется пользовательский класс оператора, вы должны предоставить его для каждого поля в индексе.
Например:
UniqueConstraint(name='unique_username', fields=['username'], opclasses=['varchar_pattern_ops'])
создает уникальный индекс на username, используя varchar_pattern_ops.
opclasses игнорируются для всех баз данных, кроме PostgreSQL.