Справочник ограничений
Классы, определённые в этом модуле, создают ограничения базы данных. Они добавляются в параметре модели 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').
Валидация ограничений
В целом, ограничения не проверяются во время full_clean(), и не вызывают ValidationError. Вместо этого вы получите ошибку целостности базы данных при save(). UniqueConstraint без condition (то есть нечастичные уникальные ограничения) в этом отношении отличаются тем, что используют существующую логику validate_unique(), и тем самым позволяют валидацию в два этапа. Помимо IntegrityError при save(), ValidationError также возникает при валидации модели, если нарушается UniqueConstraint.
CheckConstraint
-
class CheckConstraint(*, check, name) -
Создаёт ограничение проверки в базе данных.
check
-
CheckConstraint.check
Объект Q или булево Expression, который задаёт проверку, которую должно обеспечить ограничение.
Например, CheckConstraint(check=Q(age__gte=18), name='age_gte_18') гарантирует, что поле возраста никогда не будет меньше 18.
Добавлена поддержка булевых Expression.
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
Имя ограничения. Вы всегда должны указать уникальное имя для ограничения.
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.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/3.2/ref/models/constraints/