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)