Ответ
В Django Rest Framework (DRF) валидация данных является ключевой функцией сериализаторов. Существует несколько уровней для её реализации:
-
Валидация на уровне поля. Это базовый уровень, где проверка применяется к одному полю с помощью встроенных аргументов (
required
,max_length
,min_value
) или кастомных валидаторов.from rest_framework import serializers from django.core.validators import RegexValidator class ProductSerializer(serializers.Serializer): name = serializers.CharField(max_length=100) price = serializers.DecimalField(max_digits=10, decimal_places=2, min_value=0) sku = serializers.CharField(validators=[RegexValidator(r'^SKU-d{5}$')])
-
Метод
validate_<field_name>()
Для более сложной логики валидации конкретного поля в классе сериализатора определяется метод с префиксомvalidate_
.class EventSerializer(serializers.Serializer): # ... другие поля event_name = serializers.CharField() def validate_event_name(self, value): if "free" in value.lower(): raise serializers.ValidationError("Название события не должно содержать 'free'.") return value
-
Метод
validate()
Для валидации, затрагивающей несколько полей одновременно (кросс-филд валидация), используется методvalidate()
.class BookingSerializer(serializers.Serializer): start_date = serializers.DateField() end_date = serializers.DateField() def validate(self, data): if data['start_date'] > data['end_date']: raise serializers.ValidationError("Дата окончания не может быть раньше даты начала.") return data
Эти уровни позволяют выстраивать гибкую и многоуровневую систему проверки данных, от простых ограничений до сложной бизнес-логики.