Ответ
В 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
Эти уровни позволяют выстраивать гибкую и многоуровневую систему проверки данных, от простых ограничений до сложной бизнес-логики.