РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
38 of 818 menu

Метод validate_constraints

Метод validate_constraints применяется к экземпляру модели и выполняет проверку всех ограничений (constraints), определенных в классе модели. В отличие от метода full_clean, который проверяет типы полей и их значения, данный метод фокусируется исключительно на ограничениях базы данных, таких как уникальность, проверочные условия и составные ограничения. Метод выбрасывает исключение ValidationError в случае нарушения любого из ограничений.

Синтаксис

instance.validate_constraints(exclude=None, using=DEFAULT_DB_ALIAS)

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

Пример . С ограничением уникальности

Рассмотрим модель статьи с уникальным ограничением на заголовок:

from django.db import models from django.core.exceptions import ValidationError class Article(models.Model): title = models.CharField(max_length=100) content = models.TextField() class Meta: constraints = [ models.UniqueConstraint( fields=['title'], name='unique_article_title' ) ]

Попробуем создать две статьи с одинаковым заголовком:

from myapp.models import Article # Creating first article article1 = Article(title="First Article", content="Content 1") article1.save() # Creating second article with same title article2 = Article(title="First Article", content="Content 2") try: article2.validate_constraints() except ValidationError as e: print(e.message_dict)

Результат выполнения кода:

{'__all__': ['Article with this Title already exists.']}

Пример . С проверочным ограничением

Создадим модель с ограничением, которое проверяет, что возраст пользователя находится в допустимом диапазоне:

from django.db import models from django.core.exceptions import ValidationError class UserProfile(models.Model): username = models.CharField(max_length=50) age = models.IntegerField() class Meta: constraints = [ models.CheckConstraint( check=models.Q(age__gte=18) & models.Q(age__lte=100), name='age_range_check' ) ]

Попробуем создать пользователя с некорректным возрастом:

from myapp.models import UserProfile from django.core.exceptions import ValidationError # Creating user with invalid age user = UserProfile(username="john_doe", age=15) try: user.validate_constraints() except ValidationError as e: print(e.message_dict)

Результат выполнения кода:

{'__all__': ['Check constraint "age_range_check" is violated.']}

Пример . С составным ограничением

Создадим модель, где комбинация полей должна быть уникальной:

from django.db import models from django.core.exceptions import ValidationError class Subscription(models.Model): user = models.CharField(max_length=50) service = models.CharField(max_length=50) status = models.CharField(max_length=20) class Meta: constraints = [ models.UniqueConstraint( fields=['user', 'service'], name='unique_user_service_subscription' ) ]

Проверим, как метод реагирует на дублирующиеся пары "пользователь-услуга":

from myapp.models import Subscription from django.core.exceptions import ValidationError # Creating first subscription sub1 = Subscription( user="alice", service="premium", status="active" ) sub1.save() # Creating duplicate subscription sub2 = Subscription( user="alice", service="premium", status="pending" ) try: sub2.validate_constraints() except ValidationError as e: print(e.message_dict)

Результат выполнения кода:

{'__all__': ['Subscription with this User and Service already exists.']}

Пример . С исключением полей

Параметр exclude позволяет пропустить проверку определенных полей:

from myapp.models import Article from django.core.exceptions import ValidationError # Creating article that would violate constraint article = Article(title="First Article", content="New content") # Excluding title from validation try: article.validate_constraints(exclude=['title']) print("Validation passed for excluded field") except ValidationError as e: print(e.message_dict)

Результат выполнения кода:

"Validation passed for excluded field"

Смотрите также

  • метод clean_fields,
    который выполняет валидацию отдельных полей модели
  • метод clean,
    который выполняет пользовательскую валидацию модели
  • метод full_clean,
    который выполняет полную валидацию модели
  • метод validate_unique,
    который проверяет уникальность полей модели
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить