Невозможно обработать ошибку DoesNotExist с вложенными ресурсами

У меня проблемы с обработкой ошибки DoesNotExist, я использую DRF и DRF-Nested-Routers, и когда я создаю новый объект Like, мне нужен Photo PK, чтобы я мог добавить его в объект Like.

Я пытаюсь поймать ошибку, которую я получаю, когда Фото с таким PK не существует. Вот как я создаю Like в сериализаторе:

def create(self, validated_data):
    # Get the photo pk from the view context (DRF-nested-routers) and
    # create the new like with the validated_data
    photo_pk = self.context['view'].kwargs["photo_pk"]
    try:
        photo = Photo.objects.get(id=photo_pk)
    except ObjectDoesNotExist:
        return Response(data={'detail': "The photo doesn't exist."}, status=status.HTTP_404_NOT_FOUND)
    validated_data["photo"] = photo
    like, created = Like.objects.get_or_create(**validated_data)
    if created:
        photo.total_likes += 1
        photo.save()
    return like

В ответ на это я получаю следующее: {'user': 'my username here'}

Я также пробовал с except Photo.DoesNotExist, но это дает тот же результат.

Можно было бы выполнить проверку в методе validate класса сериализатора. В случае отсутствия фотографии поднять serializers.ValidationError.

Я не тестировал код, но думаю, что он работает.

class LikeModelSerializer(serializers.ModelSerializer):
   
    ...

    def validate(self, attrs):
        photo_pk = self.context['view'].kwargs["photo_pk"]
        try:
            photo = Photo.objects.get(id=photo_pk)
        except Photo.DoesNotExist:
            raise serializers.ValidationError({"detail": "The photo doesn't exist"})
        attrs["photo"] = photo
        return attrs

    def create(self, validated_data):
        # Get the photo pk from the view context (DRF-nested-routers) and
        # create the new like with the validated_data
        like, created = Like.objects.get_or_create(**validated_data)
        if created:
            photo.total_likes += 1
            photo.save()
        return like
def perform_create(self, serializer):
    """ Creates a new like.

    The substraction in the total_likes is made in the serializer.
    """
    if not serializer.is_valid():
        raise ValidationError(serializer.errors)
    serializer.save()
    return Response(data=serializer.data, status=status.HTTP_200_OK)
Вернуться на верх