在Serializer中无法理解输入和结果

时间:2019-01-09 14:17:24

标签: django-rest-framework

据我所知,序列化器的作用是将某些特殊对象转换为python-native对象,或以其他方式转换。

在以下代码中,输入数据(来自request.data)原本是非python数据,因为http请求是通过JSON格式完成的。 之后,我们在第二阶段获得了本地python数据(您可以在注释中看到)。但是奇怪的是,您再次反序列化,这使数据恢复为数据非本机python格式。我认为这完全是多余的。

谁能解释为什么我们要这样做?

class LoginAPIView(APIView):
    permission_classes = (AllowAny, )
    renderer_classes = (UserJSONRenderer,)
    serializer_class = LoginSerializer

    # 1st step 
    # 'request.data' would be JSON format, 
    # since JS or other front-end sends data in JSON format
    def post(self, request):

        #2nd step
        #Here, we can get a native python data - dictionary
        user = request.data.get('user',{}) #Here

        #3rd step          
        #putting keyword arguments in serializer 
        #would return the de-serialized object,
        #that is, a non-native python object.
        serializer = self.serializer_class(data=user) 

        serializer.is_valid(raise_exception=True)

        return Response(serializer.data, status=status.HTTP_200_OK)

1 个答案:

答案 0 :(得分:1)

第一步将JSON对象转换为字典,但除此之外,它不进行任何其他转换。此处应该表示日期,浮点数等的所有内容都将表示为字符串。这就是串行器的用武之地,在这种情况下是反序列化。在第三步中,应用验证以确保接收到的信息正确无误。如果这是正常的帖子,创建一个新对象,那么它将被保存到数据库中,但是在这种情况下,目标只是验证。最后,对象将返回到JSON以进行响应。在这种特殊情况下,最终的“转换”将是不必要的,因为模型上没有任何变化,但是请注意,实际上没有发生任何事情,因为serializer.data仅保存了在构造函数中输入的数据。