Spec-Zone.ru › Django 5.0

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

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

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

Ограничения проверяются во время валидации модели.

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

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

Вы всегда должны проверять отсутствие сообщений в логгере django.db.models вида «Получена ошибка базы данных при вызове check() для …», чтобы подтвердить надлежащую валидацию.

BaseConstraint

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

Введено в Django 5.0.
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(*, check, name, violation_error_code=None, violation_error_message=None)

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

check

CheckConstraint.check

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

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

Oracle

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

CheckConstraint(check=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"]
)
END_OF_DOCUMENT_MARKER

создаёт уникальный индекс по username с помощью varchar_pattern_ops.

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

nulls_distinct

Новая функция в Django 5.0.
UniqueConstraint.nulls_distinct

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

Например:

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

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

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

violation_error_code

Новая функция в Django 5.0.
UniqueConstraint.violation_error_code

Код ошибки, используемый, когда ValidationError возникает во время валидации модели. Значение по умолчанию - None.

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

violation_error_message

UniqueConstraint.violation_error_message

Сообщение об ошибке, используемое, когда ValidationError возникает во время валидации модели. Значение по умолчанию - BaseConstraint.violation_error_message.

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

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.0/ref/models/constraints/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API