Spec-Zone.ru › Django 3.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(check=Q(age__gte=18), name='%(app_label)s_%(class)s_is_adult').

Валидация ограничений

В целом, ограничения не проверяются во время full_clean(), и не вызывают ValidationError. Вместо этого вы получите ошибку целостности базы данных при save(). UniqueConstraint без condition (то есть нечастичные уникальные ограничения) в этом отношении отличаются тем, что используют существующую логику validate_unique(), и тем самым позволяют валидацию в два этапа. Помимо IntegrityError при save(), ValidationError также возникает при валидации модели, если нарушается UniqueConstraint.

CheckConstraint

class CheckConstraint(*, check, name)

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

check

CheckConstraint.check

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

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

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

Добавлена поддержка булевых Expression.

name

CheckConstraint.name

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

UniqueConstraint

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

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

fields

UniqueConstraint.fields

Список имён полей, которые определяют уникальный набор столбцов, которые должно обеспечивать ограничение.

Например, UniqueConstraint(fields=['room', 'date'], name='unique_booking') гарантирует, что каждый номер комнаты может быть забронирован только один раз на каждую дату.

name

UniqueConstraint.name

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

condition

UniqueConstraint.condition

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

Например:

UniqueConstraint(fields=['user'], condition=Q(status='DRAFT'), name='unique_draft_user')

гарантирует, что каждый пользователь имеет только один черновик.

Эти условия имеют те же ограничения базы данных, что и Index.condition.

deferrable

UniqueConstraint.deferrable
Новое в Django 3.1.

Установите этот параметр для создания откладываемого уникального ограничения. Допустимые значения 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
Новое в Django 3.2.

Список или кортеж имён полей, которые должны быть включены в покрывающее уникальный индекс как неключевые столбцы. Это позволяет использовать сканирование только по индексу для запросов, которые выбирают только включённые поля (include) и фильтруют только по уникальным полям (fields).

Например:

UniqueConstraint(name='unique_booking', fields=['room', 'date'], include=['full_name'])

позволит фильтровать по room и date, а также выбирать full_name, получая данные только из индекса.

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

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

opclasses

UniqueConstraint.opclasses
Новое в Django 3.2.

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

Например:

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

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

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

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

Spec-Zone.ru

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