Невозможно обработать ошибку 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)