2013-07-09 13 views
12

Domyślny zasób DRF jest ograniczony do akceptowania tego samego obiektu, który później zwraca. Chcę użyć innego serializera dla wejścia niż wyjścia. Na przykład chcę zaimplementować rejestrację użytkownika, akceptując nazwę użytkownika i hasło podczas zwracania nowego obiektu użytkownika. Czy jest możliwe użycie różnych serializerów dla wejścia i wyjścia?Użyj różnych serializerów dla danych wejściowych i wyjściowych z usługi

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

Odpowiedz

17

Mój problem polega na tym, że chcę mieć różne serializery dla wejścia i wyjścia usługi.

Jest to dość łatwe mieć różne serializers różnych metod żądanie (np coś do reakcji, aby uzyskać żądania, które różni się PUT, POST etc ...)

Wystarczy zastąpić get_serializer_class() i wrócić inną klasę serializer w zależności od wartości self.request.method.

Może to nie jest dokładnie to, czego szukasz, ponieważ gdy będziesz miał dane PUT lub POST, nadal otrzymasz ten sam styl wydruku, jaki podałeś.

W takim przypadku należy prawdopodobnie wystarczy napisać pogląd wyraźnie zamiast polegać na domyślnym ogólne widoki, coś wzdłuż tych linii ...

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

Warto też pytać o mailing list jak inni użytkownicy mogą być robić coś podobnego i mieć użyteczne wzorce do dzielenia się.

0

Jednym z rozwiązań jest TastyPie dla Django, który ma np .:

Podobnie jest w przypadku serializacji/de-se listy rializujące: Resource.alter_deserialized_list_data() i Resource.alter_list_data_to_serialize().

Uwaga: Ale wierzę, że coś podobnego jest (lub będzie) możliwe z Django REST Framework. DRF jest stosunkowo nowy, a ostatnio stanął w obliczu znaczącego refaktoryzacji. Django REST Framework ma całkiem niezłą opinię w społeczności Django, i wygląda na to, że ma sprytny zespół programistów, więc może powinieneś pomyśleć o swoich programistach lub proponowaniu ulepszeń. Oczywiście, jeśli nie znajdziesz pomocy na StackOverflow (lub napotkasz tu kilka odpowiedzi od deweloperów DRF).

Powiązane problemy