Справочник ограничений
Классы, определённые в этом модуле, создают ограничения базы данных. Они добавляются в опцию модели 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').
Проверка ограничений
Ограничения проверяются во время валидации модели.
В более старых версиях ограничения не проверялись во время валидации модели.
BaseConstraint
-
class BaseConstraint(name, violation_error_message=None) -
Базовый класс для всех ограничений. Подклассы должны реализовать методы
constraint_sql(),create_sql(),remove_sql()иvalidate().
Все ограничения имеют следующие общие параметры:
name
-
BaseConstraint.name
Имя ограничения. Вы всегда должны указывать уникальное имя для ограничения.
violation_error_message
-
BaseConstraint.violation_error_message
Сообщение об ошибке, используемое при повышении ValidationError во время валидации модели. По умолчанию "Constraint “%(name)s” is violated.".
validate()
-
BaseConstraint.validate(model, instance, exclude=None, using=DEFAULT_DB_ALIAS)
Проверяет, что ограничение, определённое на model, соблюдается на instance. Это выполнит запрос к базе данных, чтобы убедиться, что ограничение соблюдается. Если поля из списка exclude необходимы для проверки ограничения, ограничение игнорируется.
Вызовите исключение ValidationError при нарушении ограничения.
Этот метод должен быть реализован подклассом.
CheckConstraint
-
class CheckConstraint(*, check, name, violation_error_message=None) -
Создаёт ограничение проверки в базе данных.
check
-
CheckConstraint.check
Объект Q или булевое выражение Expression, которое определяет проверку, которую должно обеспечить ограничение.
Например, CheckConstraint(check=Q(age__gte=18), name='age_gte_18') гарантирует, что поле возраста никогда не будет меньше 18.
Добавлен аргумент violation_error_message.
UniqueConstraint
-
class UniqueConstraint(*expressions, fields=(), name=None, condition=None, deferrable=None, include=None, opclasses=(), violation_error_message=None) -
Создаёт уникальное ограничение в базе данных.
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') гарантирует, что каждый номер комнаты может быть забронирован только один раз на каждую дату.
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, так как ни одна из них их не поддерживает.
Предупреждение
Отложенные уникальные ограничения могут привести к снижению производительности.
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, которые следует использовать для этого уникального индекса. Если вам нужен пользовательский класс оператора, вы должны предоставить его для каждого поля в индексе.
Например:
UniqueConstraint(name='unique_username', fields=['username'], opclasses=['varchar_pattern_ops'])
создаёт уникальный индекс на username с использованием varchar_pattern_ops.
opclasses игнорируются для баз данных, помимо PostgreSQL.
violation_error_message
-
UniqueConstraint.violation_error_message
Сообщение об ошибке, используемое при повышении ValidationError во время валидации модели. По умолчанию BaseConstraint.violation_error_message.
Это сообщение не используется для UniqueConstraint с fields и без condition. Такие UniqueConstraint показывают то же сообщение, что и ограничения, определённые с помощью Field.unique или в Meta.unique_together.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/4.1/ref/models/constraints/