使用不同的序列化程序来处理服务的输入和输出

14 python django django-rest-framework

默认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')
Run Code Online (Sandbox Code Playgroud)

Tom*_*tie 20

我的问题是我想为服务的输入和输出提供不同的序列化器.

这是很容易有不同的请求方法不同的串行器(如东西响应GET请求这是不同的PUT,POST等...)

只需覆盖get_serializer_class(),并根据值的不同返回不同的序列化程序类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...
Run Code Online (Sandbox Code Playgroud)

它也值得在邮件列表上询问,因为其他用户可能正在做类似的事情并且有共享的有用模式.