2013-07-09 6 views
12

Una risorsa DRF predefinita è limitata ad accettare lo stesso oggetto restituito successivamente. Voglio utilizzare un serializzatore diverso per l'input rispetto all'output. Ad esempio, voglio implementare la registrazione utente accettando un nome utente e una password durante la restituzione del nuovo oggetto utente. È possibile utilizzare diversi serializzatori per input e output?Utilizzare serializzatori diversi per l'input e l'output da un servizio

class UserListView(generics.ListAPIView): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 

class ImaginarryUserInputSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('username', 'password', 'password_confirmation') 

class ImaginaryUserOutputSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'registration_date') 

risposta

17

mio problema è che voglio avere serializzatori diverse per input e l'output di un servizio.

E 'abbastanza facile avere serializzatori diversi per i diversi metodi di richiesta (ad esempio qualcosa da risposta alle richieste GET che è diverso a PUT, POST ecc ...)

Proprio sovrascrivono get_serializer_class(), e ritornare una diversa classe serializer in base al valore di self.request.method.

Potrebbe non essere esattamente quello che stai cercando, perché quando inserisci i dati POST o POST continuerai a utilizzare lo stesso stile di output che hai fornito.

In questo caso probabilmente si dovrebbe solo scrivere la vista esplicitamente piuttosto che basarsi su di default di vista generico, qualcosa in questo senso ...

class UserCreateOrListView(views.APIView): 
    def get(self, request, *args, **kwargs): 
     serializer = ImaginaryUserOutputSerializer(User.objects.all()) 
     return Response(serializer.data) 

    def post(self, request, *args, **kwargs): 
     serializer = ImaginaryUserInputSerializer(data=request.DATA) 
     if serializer.is_valid(): 
      user = serializer.save() 
      output_serializer = ImaginaryUserOutputSerializer(user) 
      return Response(output_serializer.data) 
     else: 
      return Response(serializer.errors, 400) 

etc... 

E 'anche la pena di chiedere il mailing list come altri utenti possono essere fare qualcosa di simile e avere modelli utili da condividere.

0

Una delle soluzioni è TastyPie per Django, che ha ad esempio .:

Simile è vero quando si serializza/de-se liste di rialazionalizzazione: Resource.alter_deserialized_list_data() e Resource.alter_list_data_to_serialize().

Nota: Ma credo che qualcosa di simile sia (o sarà) possibile con Django REST Framework. Il DRF è relativamente nuovo e di recente ha subito alcuni significativi refactoring. Django REST Framework ha una buona opinione nella comunità di Django e, apparentemente, ha un team di sviluppo intuitivo, quindi forse dovresti pensare a chiedere ai loro sviluppatori o proporre miglioramenti. Naturalmente, se non troverai alcun aiuto su StackOverflow (o incontrerai alcune risposte dagli sviluppatori di DRF qui).

Problemi correlati