Solución:
Anula tu get_serializer_class
método. Este método se utiliza en los mixins de su modelo para recuperar la clase de serializador adecuada.
Tenga en cuenta que también hay un get_serializer
método que devuelve un ejemplo del serializador correcto
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.
Puede encontrar útil esta combinación, anula el método get_serializer_class y le permite declarar un dictado que mapea la acción y la clase de serializador o retrocede al comportamiento habitual.
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()
Esta respuesta es la misma que la respuesta aceptada, pero prefiero hacerlo de esta manera.
Vistas genéricas
get_serializer_class(self):
Devuelve la clase que debe usarse para el serializador. Por defecto devuelve el
serializer_class
atributo.Puede anularse para proporcionar un comportamiento dinámico, como usar diferentes serializadores para operaciones de lectura y escritura o proporcionar diferentes serializadores a los diferentes tipos de usuarios. el atributo serializer_class.
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)