Справочник по ограничениям ¶
Классы, определенные в этом модуле, создают ограничения базы данных. Они добавлены в 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
s. Скорее вы получите ошибку целостности базы данных save()
. UniqueConstraint
s без a
condition
(т.е. неполные уникальные ограничения) отличаются в этом отношении тем, что они используют существующую
validate_unique()
логику и, таким образом, обеспечивают двухэтапную проверку. Помимо IntegrityError
on save()
, ValidationError
также возникает во время проверки модели, когда UniqueConstraint
нарушается.
CheckConstraint
¶
-
класс
CheckConstraint
( * , проверка , имя ) ¶ Создает проверочное ограничение в базе данных.
check
¶
-
CheckConstraint.
check
¶
Q
Объект или логический , Expression
который определяет чек вы хотите ограничение для выполнения.
Например,
гарантирует, что поле возраста никогда не будет меньше 18.CheckConstraint(check=Q(age__gte=18), name='age_gte_18')
Expression
Добавлена поддержка логических значений .
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
¶
Установите этот параметр, чтобы создать отложенное уникальное ограничение. Допустимые значения: 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.