Django REST Framework: Custom Action (POST) without Serializer

I am using Django REST Framework (DRF) and have a ModelViewSet with a custom action (@action) for canceling an order. The cancel action does not require a serializer since it only modifies the database and returns a response. However, when I set serializer_class = None, it does not work as expected.

Here’s my ViewSet:


class OrderViewSet(ModelViewSet):
    http_method_names = ['get', 'post', 'patch', 'delete', 'head', 'options']

    @action(detail=True, methods=['post'], permission_classes=[IsAuthenticated], serializer_class=None #Not Working)
    def cancel(self, request, pk=None):
        order = self.get_object()
        OrderService.cancel_order(order, request.user)
        return Response({'status': 'Order cancelled'}, status=status.HTTP_200_OK)

    def get_serializer_class(self):
        if self.action == 'cancel':
            return None  # Causes an error
        if self.action == 'cancel':
            return EmptySerializer # This way works
        if self.request.method == 'POST':
            return CreateOrderSerializer
        elif self.request.method == 'PATCH':
            return UpdateOrderSerializer
        return OrderSerializer

Issues

  1. Setting serializer_class = None inside @action does not work.
  2. Returning None in get_serializer_class causes 'NoneType' object is not callable' error

Now, I created an empty serializer to bypass DRF’s requirement but that's looks overwork for me to acheive this. Is there any better way to do that.

Вернуться на верх