最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

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

programmeradmin1浏览0评论

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 badges10 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
发布评论

评论列表(0)

  1. 暂无评论