Saltar al contenido

Django rest framework, use diferentes serializadores en el mismo ModelViewSet

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)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *