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