Django REST Framework: Custom Action (POST) without Serializer - Stack Overflow

admin2025-04-15  2

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.

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.

Share Improve this question asked Feb 4 at 15:26 romjanromjan 552 silver badges11 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 0

I think serializers are required and this is the way django has been designed, as per my knowledge, for using ModelViewSet.

What you need is APIView

from rest_framework.views import APIView
转载请注明原文地址:http://www.anycun.com/QandA/1744710680a86550.html