Как реализовать валидацию входных данных в Django Rest Framework

Ответ

В Django Rest Framework (DRF) валидация данных является ключевой функцией сериализаторов. Существует несколько уровней для её реализации:

  1. Валидация на уровне поля. Это базовый уровень, где проверка применяется к одному полю с помощью встроенных аргументов (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}$')])
  2. Метод 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
  3. Метод 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

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