Spec-Zone.ru › Django 3.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').

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

В общем случае, ограничения не проверяются во время 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

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

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

Добавлена интерполяция '%(app_label)s' и '%(class)s'.

UniqueConstraint

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

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

fields

UniqueConstraint.fields

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

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

name

UniqueConstraint.name

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

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

Добавлена интерполяция '%(app_label)s' и '%(class)s'.

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, так как они не поддерживаются ни одним из них.

Предупреждение

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

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

Spec-Zone.ru

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