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

Классы, определенные в этом модуле, создают ограничения базы данных. Они добавлены в Meta.constraints вариант модели .

Ссылка на встроенные ограничения

Ограничения определены в django.db.models.constraints, но для удобства они импортируются в django.db.models. Стандартное соглашение - использовать и обозначать ограничения как .from django.db import modelsmodels.<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()и не повышают ValidationErrors. Скорее вы получите ошибку целостности базы данных save(). UniqueConstraints без a condition(т.е. неполные уникальные ограничения) отличаются в этом отношении тем, что они используют существующую validate_unique()логику и, таким образом, обеспечивают двухэтапную проверку. Помимо IntegrityErroron save(), ValidationErrorтакже возникает во время проверки модели, когда UniqueConstraintнарушается.

CheckConstraint

классCheckConstraint ( * , проверка , имя )

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

check

CheckConstraint.check

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

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

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

ExpressionДобавлена поддержка логических значений .

name

CheckConstraint.name

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

UniqueConstraint

classUniqueConstraint ( * , 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.

Copyright ©2021 All rights reserved