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
- Setting
serializer_class = None
inside@action
does not work. - 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
- Setting
serializer_class = None
inside@action
does not work. - 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 badges1 Answer
Reset to default 0I 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