2014-07-09 23 views
9

dire che ho un semplice vista Django REST quadro che è l'estensione più classi modello e serve tutti i metodi di endpoint un URL:Django Resto quadro - classe serializer separato per ogni metodo nel modello di vista API basato

class UserAPIView(RetrieveAPIView, DestroyAPIView, BaseObjectAPIView): 
    permission_classes = (IsAuthenticated,) 
    serializer_class = UserSerializer 

    def get_serializer_class(self, *args, **kwargs): 
     # return different serializer depending on method??    
     # return UserUpdateSerializer 
     return UserViewSerializer 

    def get(self, request, *args, **kwargs): 
     """ 
     Retrieve user details 
     """ 
     # ... 
     return Response(data={'result': "OK"}, status=200) 

    def delete(self, request, pk): 
     """ 
     Delete user 
     """ 
     # ... 
     return Response(data={'result': "OK"}, status=200) 

    def put(self, request, pk): 
     """ 
     Change user 
     """ 
     # ...   
     return Response(data={'result': "OK"}, status=200) 

Ora bisogno di utilizzare diversi serializzatori per metodo, come il mio get-metodo utilizzerà i campi diverso dal mio put-metodo, esempio serializzatori:

class UserViewSerializer(serializers.ModelSerializer): 
    firstname = serializers.Field(source='firstname') 
    lastname = serializers.Field(source='lastname') 
    username = serializers.Field(source='username') 

    class Meta: 
     model = User 

class UserUpdateSerializer(serializers.ModelSerializer): 
    firstname = serializers.Field(source='firstname') 
    lastname = serializers.Field(source='lastname')  

    class Meta: 
     model = User 

è possibile utilizzare diversi serializzatori per ogni metodo nel mio modello vista basato su API ?

UPDATE:

so come usare diversi serializzatori all'interno dei metodi stessi.

Ma ho bisogno di ottenere l'API Browsable generata da Swagger (modulo Django rest_framework_swagger) per recuperare diversi serializzatori per ciascun metodo. Posso vedere che il caricamento della pagina del browser API attiva get_serializer_class, ma all'interno di quel metodo, non so quale metodo cerca di ottenere il serializzatore da parte di Swagger.

Come posso ottenere rest_framework_swagger per recuperare diversi serializzatori per metodo?

+1

Hai mai trovato una soluzione per questo? –

risposta

8

Penso che ci sono almeno due modi per raggiungere questo obiettivo:

  1. È sufficiente impostare il serializzatore che si desidera in ciascuno dei vostri metodi. Come questo:

    def get(self, request, *args, **kwargs): 
        self.serializer_class = UserViewSerializer 
        # ... 
        return Response(data={'result': "OK"}, status=200) 
    
  2. si modifica la get_Serializer_class metodo. Come questo:

    def get_serializer_class(self, *args, **kwargs): 
        if self.request.method == 'POST': 
         return UserUpdateSerializer 
        return UserViewSerializer 
    

Spero che questo aiuti.

+1

Grazie. Sfortunatamente, ho fatto la domanda nel modo sbagliato. In realtà ho bisogno dell'interfaccia web sfogliabile generata da Swagger per utilizzare diversi serializzatori per metodo. Ma quando Swagger recupera il serializzatore per la vista API, non c'è modo di scoprire per quale metodo Swagger chiama get_serializer_class. Forse inserirò una nuova domanda più specifica – ifischer

+0

Questo non è ciò che ha chiesto, il problema è che l'API sfogliabile genera moduli HTML utilizzando la classe serializzatore e può utilizzare solo una classe serializzatore per endpoint. – Kakaji

2

Suppongo che sia possibile utilizzare yaml docstring su ciascun metodo per sovrascrivere i serializzatori. Mi piace:

def put(self, request, pk): 
    """Change user 

    --- 
    serializer: .serializers.UserUpdateSerializer 
    """ 
    # ... 
    return Response(data={'result': "OK"}, status=200) 
Problemi correlati