2013-07-09 5 views
12

Eine Standard-DRF-Ressource ist darauf beschränkt, dasselbe Objekt zu akzeptieren, das später zurückgegeben wird. Ich möchte für die Eingabe einen anderen Serializer als die Ausgabe verwenden. Zum Beispiel möchte ich die Benutzerregistrierung implementieren, indem ich einen Benutzernamen und ein Passwort bei der Rückgabe des neuen Benutzerobjekts akzeptiere. Ist es möglich, verschiedene Serialisierer für die Ein- und Ausgabe zu verwenden?Verwenden Sie verschiedene Serializer für die Eingabe und Ausgabe von einem Service.

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') 

Antwort

17

Mein Problem ist, dass ich verschiedene Serialisierer für die Eingabe und Ausgabe eines Dienstes haben möchte.

Es ist einfach genug, um verschiedene Serializer für unterschiedliche Anforderungsmethoden zu haben (zB etwas Reaktionsanforderungen zu erhalten, die zu PUT anders, POST etc ...)

Nur get_serializer_class() außer Kraft setzen, und gibt eine andere Serializer Klasse abhängig vom Wert von self.request.method.

Das ist vielleicht nicht genau das, wonach Sie suchen, denn wenn Sie Daten PUT oder POST eingeben, erhalten Sie immer noch den gleichen Ausgabestil wie Sie geliefert haben.

In diesem Fall sollten Sie wahrscheinlich die Ansicht explizit nur schreiben und nicht auf der Standard-generic Ansichten als zu verlassen, etwas in diese Richtung ...

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... 

Es ist auch auf den mailing list fragt wert als andere Benutzer sein können etwas ähnliches tun und nützliche Muster zum Teilen haben.

0

Eine der Lösungen ist TastyPie für Django, die beispielsweise hat .:

Ähnlich ist wahr, wenn serialisieren/de-se Rialisierungslisten: Resource.alter_deserialized_list_data() und Resource.alter_list_data_to_serialize().

Hinweis: Aber ich glaube, dass etwas ähnliches mit Django REST Framework möglich ist (oder sein wird). DRF ist relativ neu und hat in letzter Zeit einige bedeutende Umgestaltungen erfahren. Django REST Framework hat eine ziemlich gute Meinung in der Django-Community und hat anscheinend ein aufschlussreiches Entwicklerteam, also sollten Sie vielleicht daran denken, ihre Entwickler zu fragen oder Verbesserungen vorzuschlagen. Natürlich, wenn Sie keine Hilfe zu StackOverflow finden (oder hier einige Antworten von DRF-Entwicklern finden).