0

I'm using viewsets with a lot of @detail_route and @list_route. In normal viewsets i use serializer_class and then some validation in serializer but in @detail_route

I'm creating serializer in view and check validation here - I know its bad.

My question is how to use @detail_route to use like normal modelviewset without need creating serializer manually but use serializer_class in decorator.

Its possible to do pagnitation without any addional code in @detail_route?

Its better to refactor code and move @detail_route and @list_route to seperated viewsets or stay on viewsets methods?

@rest_framework.decorators.detail_route(methods=['post'],
                                        serializer_class=orders_serializers.ChangeOrderStatusSerializer)
def change_status(self, request, pk=None):
    serializer = self.get_serializer(data=request.data)

    if serializer.is_valid():
        new_status = serializer.validated_data.get('status')
        order = self.get_object()

            if new_status in [orders_models.Order.EXECUTE, orders_models.Order.OUTSIDE]:
                order.status = new_status
                order.save()

                return Response({
                    'status': order.get_status_display()
                }, status=status.HTTP_200_OK)
            else:
                return Response('This new status is invalid for this order.',
                                status=status.HTTP_404_NOT_FOUND)
    else:
        return Response(serializer.errors,
                        status=status.HTTP_400_BAD_REQUEST)
Thaian
  • 1,215
  • 2
  • 20
  • 30
  • For the detail route that you provided it looks a lot like you just need to PATCH order model providing only status field as payload, you don't need different route for that. – Gabriel Muj Oct 12 '17 at 09:04
  • @GabrielMuj yes i know but i want do this this way because I have others functionality in detail_route and there cant use PATH. – Thaian Oct 12 '17 at 09:57

0 Answers0