← Назад к вопросам

Где вызывается метод is_valid?

1.0 Junior🔥 161 комментариев
#Django#REST API и HTTP

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Когда вызывается метод is_valid()

Метод is_valid() в Django REST Framework вызывается явно программистом для валидации данных сериализатора. Это не автоматический процесс — ты сам решаешь, когда его вызывать.

Типичное место вызова — в представлениях (View)

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class CreateUserView(APIView):
    def post(self, request):
        serializer = UserSerializer(data=request.data)
        
        # Здесь вызывается is_valid()
        if serializer.is_valid():
            serializer.save()  # Только после успешной валидации
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        
        # Ошибки валидации возвращаются клиенту
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Поток данных

  1. Клиент отправляет данные → POST запрос с JSON/form-data
  2. request.data содержит данные → преобразованные Django в словарь
  3. Сериализатор обёртывает данныеUserSerializer(data=request.data)
  4. Вызов is_valid() → запускаются все валидаторы
  5. Результат → True/False, ошибки в serializer.errors

Что происходит внутри is_valid()

def is_valid(self, raise_exception=False):
    # 1. Запускаются field-level валидаторы (validate_field)
    # 2. Запускаются object-level валидаторы (validate)
    # 3. Результат кешируется в self._validated_data
    # 4. Если raise_exception=True, выбрасывается исключение
    # 5. Возвращает True или False

Параметр raise_exception

try:
    serializer.is_valid(raise_exception=True)
    serializer.save()
except serializers.ValidationError as e:
    return Response(e.detail, status=status.HTTP_400_BAD_REQUEST)

В разных типах представлений

Класс-представление (ViewSet/APIView):

def create(self, request):
    serializer = self.get_serializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    self.perform_create(serializer)
    return Response(serializer.data)

Функция-представление:

@api_view(['POST'])
def create_user(request):
    serializer = UserSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data)
    return Response(serializer.errors, status=400)

Важные моменты

  • is_valid() не вызывается автоматически — ты сам контролируешь валидацию
  • Вызов save() безопасен только после is_valid() == True
  • Ошибки хранятся в serializer.errors до вызова is_valid()
  • Валидированные данные в serializer.validated_data после успешного is_valid()
  • DRY принцип — неправильно валидировать одни и те же данные несколько раз

Вызов is_valid() — это явная точка, где ты говоришь фреймворку: «Проверь эти данные!». Это даёт тебе полный контроль над процессом валидации и обработкой ошибок.