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

Классы, определенные в этом модуле, создают ограничения базы данных. Они добавлены в опции 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')

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

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

name

CheckConstraint.name

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

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

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

UniqueConstraint

classUniqueConstraint ( * , fields , name , condition = None , deferrable = None )

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

fields

UniqueConstraint.fields

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

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

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

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

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

Copyright ©2020 All rights reserved