Spec-Zone.ru › Django 4.1

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

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

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

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

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

В более старых версиях ограничения не проверялись во время валидации модели.

BaseConstraint

class BaseConstraint(name, violation_error_message=None)

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

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

name

BaseConstraint.name

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

violation_error_message

Новое в Django 4.1.
BaseConstraint.violation_error_message

Сообщение об ошибке, используемое при повышении ValidationError во время валидации модели. По умолчанию "Constraint “%(name)s” is violated.".

validate()

Новое в Django 4.1.
BaseConstraint.validate(model, instance, exclude=None, using=DEFAULT_DB_ALIAS)

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

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

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

CheckConstraint

class CheckConstraint(*, check, name, violation_error_message=None)

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

check

CheckConstraint.check

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

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

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

Добавлен аргумент violation_error_message.

UniqueConstraint

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

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

expressions

UniqueConstraint.expressions
Новое в Django 4.0.

Позиционный аргумент *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, при этом извлекая данные только из индекса.

include поддерживается только в PostgreSQL.

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

opclasses

UniqueConstraint.opclasses

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

Например:

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

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

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

violation_error_message

Новое в Django 4.1.
UniqueConstraint.violation_error_message

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

END_OF_DOCUMENT_MARKER

Это сообщение не используется для 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/4.1/ref/models/constraints/

Spec-Zone.ru

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