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

四、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返回对象了。

猜你喜欢

转载自www.cnblogs.com/forcee/p/11140885.html