• 3.1
  • 3.2
  • 6.1
  • Версия документации: 5.0

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

Классы, определенные в этом модуле, создают ограничения базы данных. Они добавляются в параметр модели Meta.constraints.

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

Ограничения определены в django.db.models.constraints, но для удобства они импортированы в django.db.models. Стандартным соглашением является использование моделей импорта из django.db и обращение к ограничениям как «модели.<Foo>Constraint».

Ограничения в абстрактных базовых классах

Вы всегда должны указывать уникальное имя для ограничения. Таким образом, вы обычно не можете указать ограничение для абстрактного базового класса, поскольку опция Meta.constraints наследуется подклассами с одинаковыми значениями атрибутов (включая name) каждый раз. Чтобы обойти конфликты имен, часть имени может содержать '%(app_label)s' и '%(class)s', которые заменяются, соответственно, меткой приложения в нижнем регистре и именем класса конкретной модели. Например, CheckConstraint(condition=Q(age__gte=18), name='%(app_label)s_%(class)s_is_adult').

Проверка ограничений

Ограничения проверяются во время проверки модели <validating-objects>.

Базовое ограничение

class BaseConstraint(*name, violation_error_code=None, violation_error_message=None)

Базовый класс для всех ограничений. Подклассы должны реализовывать методы constraint_sql(), create_sql(), remove_sql() и validate().

Не рекомендуется, начиная с версии 5.0: Поддержка передачи позиционных аргументов устарела.

Все ограничения имеют следующие общие параметры:

name

BaseConstraint.name

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

violation_error_code

New in Django 5.0.
BaseConstraint.violation_error_code

Код ошибки, используемый, когда ValidationError возникает во время проверки модели <validating-objects>`. По умолчанию установлено значение «Нет».

violation_error_message

BaseConstraint.violation_error_message

Сообщение об ошибке, используемое, когда ValidationError возникает во время проверки модели <validating-objects>`. По умолчанию "Ограничение «%(name)s» нарушено»..

валидировать()

BaseConstraint.validate(model, instance, exclude=None, using=DEFAULT_DB_ALIAS)

Проверяет, что ограничение, определенное в модели, соблюдается в экземпляре. Это выполнит запрос к базе данных, чтобы убедиться, что ограничение соблюдается. Если поля в списке исключений необходимы для проверки ограничения, ограничение игнорируется.

Вызовите ValidationError, если ограничение нарушено.

Этот метод должен быть реализован подклассом.

CheckConstraint

class CheckConstraint(*, condition, name, violation_error_code=None, violation_error_message=None)

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

условие

CheckConstraint.condition

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

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

Порядок выражения

Порядок аргументов Q не обязательно сохраняется, однако порядок самих выражений Q сохраняется. Это может быть важно для баз данных, которые сохраняют порядок выражений проверочных ограничений по соображениям производительности. Например, если порядок имеет значение, используйте следующий формат:

CheckConstraint(
    condition=Q(age__gte=18) & Q(expensive_check=condition),
    name="age_gte_18_and_others",
)

Оракул < 23c

Проверки с полями, допускающими значение NULL, в Oracle < 23c должны включать условие, разрешающее значения NULL, чтобы validate() вел себя так же, как проверка ограничений проверки. Например, если age является полем, допускающим значение NULL:

CheckConstraint(condition=Q(age__gte=18) | Q(age__isnull=True), name="age_gte_18")

Не рекомендуется, начиная с версии 5.1: Атрибут check устарел в пользу condition.

UniqueConstraint

class UniqueConstraint(*expressions, fields=(), name=None, condition=None, deferrable=None, include=None, opclasses=(), nulls_distinct=None, violation_error_code=None, violation_error_message=None)

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

expression

UniqueConstraint.expressions

Позиционный аргумент *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') гарантирует, что каждый номер можно забронировать только один раз на каждую дату.

условие

UniqueConstraint.condition

Объект Q, задающий условие, которое должно выполняться ограничением.

Например:

UniqueConstraint(fields=["user"], condition=Q(status="DRAFT"), name="unique_draft_user")

гарантирует, что у каждого пользователя будет только один черновик.

Эти условия имеют те же ограничения базы данных, что и Index.condition.

отсрочка

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

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

Отложенные ограничения уникальности могут привести к «снижению производительности <https://www.postgresql.org/docs/current/sql-createtable.html#id-1.9.3.85.9.4>».

include

UniqueConstraint.include

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

Например:

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

позволит фильтровать по комнате и дате, а также выбирать полное_имя, извлекая данные только из индекса.

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

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

опклассы

UniqueConstraint.opclasses

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

Например:

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

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

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

nulls_distinct

New in Django 5.0.
UniqueConstraint.nulls_distinct

Следует ли считать строки, содержащие значения NULL, на которые распространяется ограничение уникальности, отличными друг от друга. Значением по умолчанию является «Нет», которое использует значение по умолчанию для базы данных, равное «True» на большинстве бэкэндов.

Например:

UniqueConstraint(name="ordering", fields=["ordering"], nulls_distinct=False)

создает уникальное ограничение, которое позволяет только одной строке хранить значение NULL в столбце упорядочения.

Уникальные ограничения с nulls_distinct игнорируются для баз данных, кроме PostgreSQL 15+.

violation_error_code

New in Django 5.0.
UniqueConstraint.violation_error_code

Код ошибки, используемый, когда ValidationError возникает во время проверки модели <validating-objects>`. По умолчанию установлено значение «Нет».

Этот код не используется для UniqueConstraints с fields и без condition. Такие UniqueConstraints имеют тот же код ошибки, что и ограничения, определенные с помощью Field.unique или в Meta.unique_together.

violation_error_message

UniqueConstraint.violation_error_message

Сообщение об ошибке, используемое, когда ValidationError возникает во время проверки модели <validating-objects>`. По умолчанию: BaseConstraint.violation_error_message.

Это сообщение не используется для UniqueConstraints с fields и без condition. Такие UniqueConstraints отображают то же сообщение, что и ограничения, определенные с помощью Field.unique или в Meta.unique_together.

Back to Top