Django Rest Framework - separate serializer class per method in model based API view

django-rest-framework

Solution

I think there are at least two ways to achieve this:

You simply set the serializer that you want in each of your methods. Like this:

def get(self, request, *args, **kwargs):
    self.serializer_class = UserViewSerializer
    # ...
    return Response(data={'result': "OK"}, status=200) 

You override the get_Serializer_class method. Like this:

def get_serializer_class(self, *args, **kwargs):
    if self.request.method == 'POST':
        return UserUpdateSerializer
    return UserViewSerializer

Hope this helps.

Problem

Say I have a simple Django REST Framework view that's extending multiple model classes and serves all the methods in one URL endpoint: ``` class UserAPIView(RetrieveAPIView, DestroyAPIView, BaseObjectAPIView): permission_classes = (IsAuthenticated, ) serializer_class = UserSerializer def get_serializer_class(self, *args, **kwargs): # return different serializer depending on method?? # return UserUpdateSerializer return UserViewSerializer def get(self, request, *args, **kwargs): """ Retrieve user details """ # ... return Response(data={'result': "OK"}, status=200) def delete(self, request, pk): """ Delete user """ # ... return Response(data={'result': "OK"}, status=200) def put(self, request, pk): """ Change user """ # ... return Response(data={'result': "OK"}, status=200) ``` Now I need to use different serializers per method, as my get-method will use different fields than my put-method, example serializers: ``` class UserViewSerializer(serializers.ModelSerializer): firstname = serializers.Field(source='firstname') lastname = serializers.Field(source='lastname') username = serializers.Field(source='username') class Meta: model = User class UserUpdateSerializer(serializers.ModelSerializer): firstname = serializers.Field(source='firstname') lastname = serializers.Field(source='lastname') class Meta: model = User ``` Is it possible to use different serializers for each method in my model based API view? UPDATE: I know how to use different serializers inside the methods themselves. But I need to get the Browsable API generated by Swagger (Django module rest_framework_swagger) to retrieve different serializers for each method. I can see that loading the API browser page triggers get_serializer_class, but inside that method, I don't know what method Swagger tries to get the serializer for. How can I get rest_framework_swagger to retrieve different serializers per method?

Original source