对服务的输入和输出使用不同的序列化器 [英] Use different serializers for input and output from a service

查看:62
本文介绍了对服务的输入和输出使用不同的序列化器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

默认DRF资源仅限于接受以后返回的同一对象.我想对输入使用与输出不同的串行器.例如,我想通过在返回新用户对象时接受用户名和密码来实现用户注册.可以对输入和输出使用不同的序列化器吗?

A default DRF resource is limited to accepting the same object it later returns. I want to use a different serializer for the input than the output. For example, I want to implement user registration by accepting a username and password while returning the new user object. Is it possible to use different serializers for input and output?

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

推荐答案

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

My problem is that I want to have different serializers for input and output of a service.

很容易为不同的请求方法使用不同的序列化器(例如,对GET请求的响应与 PUT POST 等不同)...

It's easy enough to have different serializers for different request methods (eg something to response to GET requests that's different to PUT, POST etc...)

只需覆盖 get_serializer_class(),然后根据 self.request.method 的值返回不同的序列化器类.

Just override get_serializer_class(), and return a different serializer class depending on the value of self.request.method.

这可能并不是您真正想要的,因为当您进行PUT或POST数据时,最终仍然会得到与您提供的输出样式相同的输出样式.

That may not be exactly what you're looking for because when you PUT or POST data you'll still end up with the same output style as you supplied.

在这种情况下,您可能应该只显式地编写视图,而不要依赖默认的通用视图,而是遵循这些原则……

In that case you should probably just write the view explicitly rather than relying on the default generic views, something along these lines...

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

同样值得在邮件列表上进行询问用户可能正在做类似的事情,并具有有用的共享模式.

It's also worth asking on the mailing list as other users may be doing something similar and have useful patterns to share.

这篇关于对服务的输入和输出使用不同的序列化器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆