23

默认 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')
4

2 回答 2

29

我的问题是我想为服务的输入和输出使用不同的序列化程序。

为不同的请求方法使用不同的序列化程序很容易(例如,响应与 GET 不同的请求的东西PUTPOST等等......)

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

在邮件列表中询问也是值得的,因为其他用户可能正在做类似的事情并且有有用的模式可以分享。

于 2013-07-09T15:52:22.167 回答
0

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

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

注意:但我相信 Django REST 框架可能(或将会)发生类似的事情。DRF 相对较新,最近面临一些重大的重构。Django REST Framework 在 Django 社区中拥有相当不错的评价,并且似乎拥有富有洞察力的开发团队,所以也许你应该考虑询问他们的开发人员或提出改进建议。当然,如果您在 StackOverflow 上找不到任何帮助(或在此处遇到 DRF 开发人员的一些答案)。

于 2013-07-09T14:56:46.460 回答