Spec-Zone.ru › Django 6.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(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.

Изменено в 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/6.0/ref/models/constraints/

Spec-Zone.ru

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