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

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

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

UniqueConstraint

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

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

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
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.

include

UniqueConstraint.include
New in Django Development version.

Список или кортеж имен полей, которые должны быть включены в охватывающий уникальный индекс в качестве неключевых столбцов. Это позволяет использовать сканирование только по индексу для запросов, которые выбирают только включенные поля (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 Development version.

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

Например:

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

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

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

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