Справочник по ограничениям
Классы, определённые в этом модуле, создают ограничения базы данных. Они добавляются в параметр модели 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(condition=Q(age__gte=18), name="%(app_label)s_%(class)s_is_adult")
Проверка ограничений
Ограничения проверяются во время проверки модели.
BaseConstraint
-
class BaseConstraint(*name, violation_error_code=None, violation_error_message=None)[исходный код] -
Базовый класс для всех ограничений. Подклассы должны реализовывать методы
constraint_sql(),create_sql(),remove_sql()иvalidate().
Для всех ограничений предусмотрены следующие общие параметры:
name
-
BaseConstraint.name
Имя ограничения. Для ограничения всегда необходимо указывать уникальное имя.
violation_error_code
-
BaseConstraint.violation_error_code
Код ошибки, используемый при возникновении ValidationError во время проверки модели. По умолчанию используется None.
violation_error_message
-
BaseConstraint.violation_error_message
Сообщение об ошибке, используемое при возникновении ValidationError во время проверки модели. По умолчанию используется "Constraint “%(name)s” is violated.".
validate()
-
BaseConstraint.validate(model, instance, exclude=None, using=DEFAULT_DB_ALIAS)[исходный код]
Проверяет, соблюдается ли ограничение, заданное для model, на instance. Для проверки соблюдения ограничения выполняется запрос к базе данных. Если для проверки ограничения необходимы поля из списка exclude, ограничение игнорируется.
Если ограничение нарушено, вызывает ValidationError.
Этот метод должен быть реализован в подклассе.
CheckConstraint
-
class CheckConstraint(*, condition, name, violation_error_code=None, violation_error_message=None)[исходный код] -
Создаёт ограничение-проверку в базе данных.
condition
-
CheckConstraint.condition
Объект Q или логическое Expression, задающее условие, которое должно обеспечиваться ограничением.
Например:
CheckConstraint(condition=Q(age__gte=18), name="age_gte_18")
гарантирует, что значение поля age никогда не будет меньше 18.
Порядок выражений
Порядок аргументов Q не обязательно сохраняется, однако порядок самих выражений Q сохраняется. Это может быть важно для баз данных, в которых порядок выражений ограничения-проверки влияет на производительность. Например, если порядок важен, используйте следующий формат:
CheckConstraint(
condition=Q(age__gte=18) & Q(expensive_check=condition),
name="age_gte_18_and_others",
)
Oracle < 23c
Для проверок с nullable-полями в Oracle < 23c необходимо добавить условие, допускающее значения NULL, чтобы метод validate() работал так же, как проверка ограничений-проверок. Например, если age — nullable-поле:
CheckConstraint(condition=Q(age__gte=18) | Q(age__isnull=True), name="age_gte_18")
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)[исходный код] -
Создаёт ограничение уникальности в базе данных.
expressions
-
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")
гарантирует, что каждый номер можно забронировать только один раз на каждую дату.
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, поскольку эти СУБД их не поддерживают.
Предупреждение
Отложенные ограничения уникальности могут привести к снижению производительности.
include
-
UniqueConstraint.include
Список или кортеж имён полей, включаемых в покрывающий уникальный индекс как неключевые столбцы. Это позволяет использовать сканирование только по индексу для запросов, выбирающих только включённые поля (include) и фильтрующих только по уникальным полям (fields).
Например:
UniqueConstraint(name="unique_booking", fields=["room", "date"], include=["full_name"])
позволит фильтровать по room и date, а также выбирать full_name, получая данные только из индекса.
Уникальные ограничения с неключевыми столбцами игнорируются во всех СУБД, кроме PostgreSQL.
На неключевые столбцы распространяются те же ограничения базы данных, что и на Index.include.
opclasses
-
UniqueConstraint.opclasses
Имена классов операторов PostgreSQL, используемых для этого уникального индекса. Если требуется пользовательский класс операторов, необходимо указать его для каждого поля индекса.
Например:
UniqueConstraint(
name="unique_username", fields=["username"], opclasses=["varchar_pattern_ops"]
)
создаёт уникальный индекс для username с использованием varchar_pattern_ops.
opclasses игнорируются во всех СУБД, кроме PostgreSQL.
nulls_distinct
-
UniqueConstraint.nulls_distinct
Следует ли считать строки, содержащие значения NULL, охваченные ограничением уникальности, отличными друг от друга. Значение по умолчанию — None, которое использует значение по умолчанию для базы данных: True в большинстве серверных СУБД.
Например:
UniqueConstraint(name="ordering", fields=["ordering"], nulls_distinct=False)
создаёт ограничение уникальности, которое позволяет сохранить значение NULL в столбце ordering только в одной строке.
Уникальные ограничения с nulls_distinct игнорируются во всех СУБД, кроме PostgreSQL 15+.
violation_error_code
-
UniqueConstraint.violation_error_code
Код ошибки, используемый при возникновении ValidationError во время проверки модели.
По умолчанию используется BaseConstraint.violation_error_code, если задано UniqueConstraint.condition или не задано UniqueConstraint.fields.
Если задано UniqueConstraint.fields, но не задано UniqueConstraint.condition, для нескольких полей по умолчанию используется код ошибки Meta.unique_together, а для одного поля — код ошибки Field.unique.
В предыдущих версиях указанное значение UniqueConstraint.violation_error_code не использовалось, если было задано UniqueConstraint.fields, но не задано UniqueConstraint.condition.
violation_error_message
-
UniqueConstraint.violation_error_message
Сообщение об ошибке, используемое при возникновении ValidationError во время проверки модели.
По умолчанию используется BaseConstraint.violation_error_message, если задано UniqueConstraint.condition или не задано UniqueConstraint.fields.
Если задано UniqueConstraint.fields, но не задано UniqueConstraint.condition, для нескольких полей по умолчанию используется сообщение об ошибке Meta.unique_together, а для одного поля — сообщение об ошибке Field.unique.
В предыдущих версиях указанное значение UniqueConstraint.violation_error_message не использовалось, если было задано UniqueConstraint.fields, но не задано UniqueConstraint.condition.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/models/constraints/