Ссылка на ограничение ¶
Классы, определенные в этом модуле, создают ограничения базы данных. Они добавлены в опции Meta.constraints
моделей.
Ссылка на встроенные ограничения
Ограничения определены в django.db.models.constraints
, но для удобства они импортируются в django.db.models
. Стандартное соглашение - использовать и ссылаться на ограничения с помощью .from django.db import models
models.<Telle>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
¶
-
класс
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 ) ¶ Создает уникальное ограничение в базе данных.
fields
¶
-
UniqueConstraint.
fields
¶
Список имен полей, указывающий уникальный набор столбцов, для которых ограничение гарантирует уникальность.
Например, убедитесь, что каждую комнату можно забронировать только один раз за день.UniqueConstraint(fields=['chambre', 'date'], name='reservation_unique')
name
¶
-
UniqueConstraint.
name
¶
Имя ограничения. Ограничение всегда должно иметь уникальное имя.
Добавлена интерполяция переменных '%(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
¶
Установите этот параметр, чтобы создать отложенное уникальное ограничение. Допустимые значения: 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, поскольку ни одна из них не поддерживает их.
Предупреждение
Отложенные уникальные ограничения могут привести к снижению производительности .