首页 > 其他 > 详细

Django-rest-framework源码分析(二)

时间:2019-07-05 22:23:56      阅读:91      评论:0      收藏:0      [点我收藏+]

四、Serializer的其他方法

  在《Django-rest-framework源码分析(一)》中我分析了Serializer对象实例化的过程,而Serializer类的其他方法并没有涉及。

  序列化最重要的是拿到对象序列化后的结果,这个结果被保存在了序列化对象的.data属性中。下面重点来看.data属性

  入口 serializer_obj.data

  rest_framework/serializer.py/class Serializer/def data()

  技术分享图片

  它是一个被包装成属性的方法,在方法中执行了父类的data方法,并且把父类.data的返回值转化成ReturnDict数据类型返回。

  rest_framework/serializer.py/class BaseSerializer/def data()

  技术分享图片

  红框内的部分实现了一种类似单例的模式,当序列化对象有_data属性的时候,直接返回,不调用函数,这就避免了资源的浪费,去重复执行一些函数(因为每一次执行的结果都是相同的)。它的实现方式是利用反射查找属性_data是否存在,如果不存在,把要返回的结果设置给_data属性,下次再调用data()函数的时候,就直接返回了self._data。

  进入if语句中,只要self没有错误属性,且instance不为空或者有_validated_data属性,都会执行一个.to_representation的方法,只是传的参数不同。

  rest_framework/serializer.py/class BaseSerializer/def __init__()

  技术分享图片

  当我们序列化一个数据对象的时候,一般是直接位置传参,数据对象被参数instance接收,这个时候instance不为空,我们再看BaseSerializer的data方法。

  rest_framework/serializer.py/class BaseSerializer/def data()

   技术分享图片

  rest_framework/serializer.py/class Serializer/def to_representation()

  技术分享图片

  真正进行序列化操作的是Serializer类重写的to_representation方法,它将每一个字段都进行了字段自己的校验,然后放入OrderDict有序字典中,再将有序字典返回。这个有序字典在Serializer的def data方法中用ReturnDict加工之后,就是最后的serializer_obj.data返回对象了。

Django-rest-framework源码分析(二)

原文:https://www.cnblogs.com/forcee/p/11140885.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!