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