Я использую такую конструкцию:
class MultiSerializerViewSetMixin(object):
def get_serializer_class(self):
"""
Смотрим на serializer class в self.serializer_action_classes, который представляет из себя
dict mapping action name (key) в serializer class (value), например::
class MyViewSet(MultiSerializerViewSetMixin, ViewSet):
serializer_class = MyDefaultSerializer
serializer_action_classes = {
'list': MyListSerializer,
'my_action': MyActionSerializer,
}
@action
def my_action:
...
Если подходящих вхождений в action нет тогда просто fallback к обычному
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()
Пример с ModelViewSet:
class MyViewSet(MultiSerializerViewSetMixin, ModelViewSet):
queryset = My.objects.all()
serializer_class = MySerializer
serializer_action_classes = {
'list': MyGetSerializer,
'create': MySerializer,
'retrieve': MyGetSerializer,
'update': MySerializer,
'partial_update': MySerializer,
# etc.
}
Соответственно, к примеру, MySerializer - стандартный вариант сериализера, а MyGetSerializer - полон развёрнутых связанных сущностей, вычисляемых кастомных полей и прочих чудес, облегчающих труд фронтендщика...