Справочник по ограничениям

Классы, определенные в этом модуле, создают ограничения базы данных. Они добавляются в опцию модели 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(), и не вызывают ValidationErrors. Скорее вы получите ошибку целостности базы данных на save(). UniqueConstraints без 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.

Changed in Django 3.1:

Добавлена поддержка булевых значений Expression.

name

CheckConstraint.name

Имя ограничения. Вы всегда должны указывать уникальное имя для ограничения.

Changed in Django 3.0:

Добавлена интерполяция '%(app_label)s' и '%(class)s'.

UniqueConstraint

class UniqueConstraint(*, fields, name, condition=None, deferrable=None)[исходный код]

Создает уникальное ограничение в базе данных.

fields

UniqueConstraint.fields

Список имен полей, определяющий уникальный набор столбцов, на которые необходимо наложить ограничение.

Например, UniqueConstraint(fields=['room', 'date'], name='unique_booking') гарантирует, что каждый номер может быть забронирован только один раз на каждую дату.

name

UniqueConstraint.name

Имя ограничения. Вы всегда должны указывать уникальное имя для ограничения.

Changed in Django 3.0:

Добавлена интерполяция '%(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
New in Django 3.1.

Установите этот параметр, чтобы создать откладываемое уникальное ограничение. Принимаются значения 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.

Вернуться на верх