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