Справочник по ограничениям¶
Классы, определенные в этом модуле, создают ограничения базы данных. Они добавляются в опцию модели Meta.constraints.
Обращение к встроенным ограничениям
Ограничения определены в django.db.models.constraints, но для удобства они импортированы в django.db.models. Стандартным соглашением является использование from django.db import models и обращение к ограничениям как models.<Foo>Constraint.
Ограничения в абстрактных базовых классах
Вы всегда должны указывать уникальное имя для ограничения. Как таковое, вы не можете нормально указать ограничение на абстрактный базовый класс, поскольку опция Meta.constraints наследуется подклассами, с точно такими же значениями атрибутов (включая name) каждый раз. Вместо этого укажите опцию constraints непосредственно на подклассах, задавая уникальное имя для каждого ограничения.
Валидация ограничений
В общем случае ограничения не проверяются во время full_clean(), и не вызывают ValidationErrors. Скорее вы получите ошибку целостности базы данных на save(). UniqueConstraints без 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.
UniqueConstraint¶
-
class
UniqueConstraint(*, fields, name, condition=None)[исходный код]¶ Создает уникальное ограничение в базе данных.
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.