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
- 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.