Ответы пользователя по тегу Django Rest Framework
  • Как переопределить handler500?

    @antonksa
    https://www.django-rest-framework.org/api-guide/ex...

    #  my_project/my_app/utils.py
    
    from rest_framework.exceptions import APIException
    from rest_framework.views import exception_handler
    
    def custom_exception_handler(exc, context):
        # Call REST framework's default exception handler first,
        # to get the standard error response.
        response = exception_handler(exc, context)
    
        # Now add the HTTP status code to the response.
        if response is not None:
            if response.status_code == 500:
                #  My custom 500 error handler.
                pass
        return response


    #  settings.py
    
    REST_FRAMEWORK = {
        'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
    }


    ЗЫ. аймсорри, неправильно понял вопрос. Вообще-то если у вас DRF обрабатывает урл, то там по умолчанию и DRF обрабатывает 500, если у вас не так, то вы что-то не так делаете.
    Ответ написан
    1 комментарий
  • Как достать kwargs из url в DRF?

    @antonksa
    Кривоватое решение. Достаточно передать несуществующий id прилетит 500.
    Поэтому все первичные ключи нужно валидировать.

    class RatingSerializer(serializers.Serializer):
        user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
        rating = serializers.IntegerField(min_value=1, max_value=5)
    
        def create(self, validated_data):
            user = validated_data['user']
            rating = validated_data['rating']
            profile = Profile.objects.get(user=user)
            rating_obj = Rating.objects.create(profile=profile, rating=rating)
            return rating_obj


    А вьюха должна тогда выглядеть так:
    class RatingAdd(generics.GenericAPIView):
        serializer_class = serializers.RatingSerializer
        permission_classes = [IsAuthenticated]
    
        def post(self, request, **kwargs):
            data = request.data.copy()
            data.update({'user': kwargs['userid'}})
            serializer = self.get_serializer(data=data)
            serializer.is_valid(raise_exception=True)
            serializer.save()
    
            return Response(serializer.data, status=status.HTTP_201_CREATED)


    (upd) Сорян, поправил вьюху, т.к. не удалил кусок оригинального кода.

    Что до вопроса про kwargs, то непонятно чего вы ждали, ведь это же kwargs ViewSet'a а не сериализера. Тут нужно быть осторожным, но вообще их можно выковырять из контекста, так как ApiView.get_serializer() еще пропихивает в сериализер контекст:
    def create(self, validated_data):
        view = self.context.get('view')
        userid = view.kwargs['userid'] if view else None
        if not userid:
            raise NotFound('User with given id does not exist.')
        rating = Rating.objects.create(profile=Profile.objects.get(user__id=userid), **validated_data)
        return rating
    Ответ написан
    Комментировать