Django rest framework, use different serializers in the same ModelViewSet Django rest framework, use different serializers in the same ModelViewSet django django

Django rest framework, use different serializers in the same ModelViewSet


Override your get_serializer_class method. This method is used in your model mixins to retrieve the proper Serializer class.

Note that there is also a get_serializer method which returns an instance of the correct Serializer

class DualSerializerViewSet(viewsets.ModelViewSet):    def get_serializer_class(self):        if self.action == 'list':            return serializers.ListaGruppi        if self.action == 'retrieve':            return serializers.DettaglioGruppi        return serializers.Default # I dont' know what you want for create/destroy/update.                


You may find this mixin useful, it overrides the get_serializer_class method and allows you to declare a dict that maps action and serializer class or fallback to the usual behavior.

class MultiSerializerViewSetMixin(object):    def get_serializer_class(self):        """        Look for serializer class in self.serializer_action_classes, which        should be a dict mapping action name (key) to serializer class (value),        i.e.:        class MyViewSet(MultiSerializerViewSetMixin, ViewSet):            serializer_class = MyDefaultSerializer            serializer_action_classes = {               'list': MyListSerializer,               'my_action': MyActionSerializer,            }            @action            def my_action:                ...        If there's no entry for that action then just fallback to the regular        get_serializer_class lookup: self.serializer_class, DefaultSerializer.        """        try:            return self.serializer_action_classes[self.action]        except (KeyError, AttributeError):            return super(MultiSerializerViewSetMixin, self).get_serializer_class()


This answer is the same as the accepted answer but I prefer to do in this way.

Generic views

get_serializer_class(self):

Returns the class that should be used for the serializer. Defaults to returning the serializer_class attribute.

May be overridden to provide dynamic behavior, such as using different serializers for reading and write operations or providing different serializers to the different types of users. the serializer_class attribute.

class DualSerializerViewSet(viewsets.ModelViewSet):    # mapping serializer into the action    serializer_classes = {        'list': serializers.ListaGruppi,        'retrieve': serializers.DettaglioGruppi,        # ... other actions    }    default_serializer_class = DefaultSerializer # Your default serializer    def get_serializer_class(self):        return self.serializer_classes.get(self.action, self.default_serializer_class)