Справочник по ограничениям¶
Классы, определенные в этом модуле, создают ограничения базы данных. Они добавляются в опцию модели 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
s. Скорее вы получите ошибку целостности базы данных на save()
. UniqueConstraint
s без 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
.
UniqueConstraint
¶
-
class
UniqueConstraint
(*, fields, name, condition=None, deferrable=None)[исходный код]¶ Создает уникальное ограничение в базе данных.
fields
¶
-
UniqueConstraint.
fields
¶
Список имен полей, определяющий уникальный набор столбцов, на которые необходимо наложить ограничение.
Например, UniqueConstraint(fields=['room', 'date'], name='unique_booking')
гарантирует, что каждый номер может быть забронирован только один раз на каждую дату.
name
¶
-
UniqueConstraint.
name
¶
Имя ограничения. Вы всегда должны указывать уникальное имя для ограничения.
Добавлена интерполяция '%(app_label)s'
и '%(class)s'
.
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.