2013-07-09 3 views
12

デフォルトのDRFリソースは、後で返す同じオブジェクトを受け入れることに限定されています。出力とは別のシリアライザを使用したいたとえば、新しいユーザーオブジェクトを返すときにユーザー名とパスワードを受け入れてユーザー登録を実装したいとします。入力と出力に異なるシリアライザを使用することは可能ですか?サービスからの入出力に異なるシリアライザを使用する

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

答えて

17

私の問題は、サービスの入出力にさまざまなシリアライザを使いたいということです。

それは

ちょうどget_serializer_class()をオーバーライドし、異なるシリアライザクラスを返します(... PUTPOSTなどに違うのGETリクエストに応答するなど何か)異なる要求メソッドの異なるシリアライザを持つことは簡単ですself.request.methodの値によって異なります。

PUTまたはPOSTデータを入力しても、入力したときと同じ出力スタイルになりますので、正確にはそうではありません。あなたはおそらくビューを作成し、明示的ではなく、デフォルトの汎用ビュー、これらの線に沿って何かに頼る必要があり、その場合には

...

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

他のユーザーによってはそれはまたmailing listに尋ねる価値があります同様のことをして、共有するための有用なパターンを持っている。

0

解決策の一つは、例えばを持っているDjangoの、ためTastyPieです。:

シリアライズ/デセイ試聴リスト:Resource.alter_deserialized_list_data()Resource.alter_list_data_to_serialize()

注::しかし、私はDjango REST Frameworkで同様のことが可能であると考えています。 DRFは比較的新しいものであり、最近は重要なリファクタリングに直面しています。 Django RESTフレームワークはDjangoコミュニティでかなり良い意見を持っていますし、見た目にも洞察力のある開発チームを持っているので、開発者に質問したり改良を提案してください。もちろん、StackOverflowに関するヘルプが見つからない場合(またはDRF開発者からの回答がいくつか出てくる場合)

関連する問題