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

时间:2013-07-09 14:50:05

标签: 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')

2 个答案:

答案 0 :(得分:20)

  

我的问题是我想为服务的输入和输出设置不同的序列化器。

为不同的请求方法提供不同的序列化器很容易(例如,响应与PUTPOST等不同的GET请求...

只需覆盖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...

同样值得在mailing list上询问,因为其他用户可能正在做类似的事情并且有共享的有用模式。

答案 1 :(得分:0)

Django的解决方案之一是TastyPie,例如:

序列化/反序列化列表时也是如此:Resource.alter_deserialized_list_data()Resource.alter_list_data_to_serialize()

注意:但我相信Django REST Framework可能会(甚至可能)实现类似的功能。 DRF相对较新,最近面临一些重大的重构。 Django REST Framework在Django社区中有很好的意见,并且看起来有很有洞察力的开发团队,所以也许你应该考虑询问他们的开发人员或提出改进建议。当然,如果您在StackOverflow上找不到任何帮助(或者在这里遇到DRF开发人员的一些答案)。