Spec-Zone.ru › Django 5.2

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

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

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

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

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

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) [source]

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

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

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

CheckConstraint

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

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

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")

Устарело начиная с версии 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) [source]

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

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 — для одного поля.

Изменено в Django 5.2:

В более ранних версиях предоставленное 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 — для одного поля.

Изменено в Django 5.2:

В более ранних версиях предоставленное UniqueConstraint.violation_error_message не использовалось, когда UniqueConstraint.fields было установлено без UniqueConstraint.condition.

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

Spec-Zone.ru

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