Ссылка на ограничения

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

Валидация ограничений

In general constraints are not checked during full_clean(), and do not raise ValidationErrors. Rather you’ll get a database integrity error on save(). UniqueConstraints without a condition (i.e. non-partial unique constraints) and expressions (i.e. non-functional unique constraints) are different in this regard, in that they leverage the existing validate_unique() logic, and thus enable two-stage validation. In addition to IntegrityError on save(), ValidationError is also raised during model validation when the UniqueConstraint is violated.

CheckConstraint

class CheckConstraint(*, check, name)[исходный код]

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

check

CheckConstraint.check

Объект Q или булево Expression, который определяет проверку, которую вы хотите, чтобы ограничение выполняло.

Например, CheckConstraint(check=Q(age__gte=18), name='age_gte_18') гарантирует, что поле возраст никогда не будет меньше 18.

name

CheckConstraint.name

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

UniqueConstraint

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

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

expressions

UniqueConstraint.expressions
New in Django 4.0.

Позиционный аргумент *expressions позволяет создавать функциональные уникальные ограничения на выражения и функции базы данных.

Например:

UniqueConstraint(Lower('name').desc(), 'category', name='unique_lower_name_category')

создает уникальное ограничение на строчные значения поля name в порядке убывания и поля category в порядке возрастания по умолчанию.

Функциональные уникальные ограничения имеют те же ограничения базы данных, что и Index.expressions.

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, поскольку ни один из них их не поддерживает.

Предупреждение

Отложенные уникальные ограничения могут привести к ошибке performance penalty.

include

UniqueConstraint.include
New in Django 3.2.

Список или кортеж имен полей, которые должны быть включены в охватывающий уникальный индекс в качестве неключевых столбцов. Это позволяет использовать сканирование только по индексу для запросов, которые выбирают только включенные поля (include) и фильтруют только по уникальным полям (fields).

Например:

UniqueConstraint(name='unique_booking', fields=['room', 'date'], include=['full_name'])

позволит фильтровать по room и date, также выбирая full_name, при этом получая данные только из индекса.

include поддерживается только в PostgreSQL.

Столбцы без ключей имеют те же ограничения базы данных, что и Index.include.

opclasses

UniqueConstraint.opclasses
New in Django 3.2.

Имена операторов PostgreSQL operator classes для использования для этого уникального индекса. Если вам требуется пользовательский класс оператора, вы должны предоставить его для каждого поля в индексе.

Например:

UniqueConstraint(name='unique_username', fields=['username'], opclasses=['varchar_pattern_ops'])

создает уникальный индекс на username, используя varchar_pattern_ops.

opclasses игнорируются для всех баз данных, кроме PostgreSQL.

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