Django-rest-framework源码分析(二)
四、Serializer对象的data属性
在《Django-rest-framework源码分析(一)》中我分析了Serializer对象实例化的过程,而Serializer类的其他方法并没有涉及。
序列化最重要的是拿到对象序列化后的结果,这个结果被保存在了序列化对象的.data属性中。下面重点来看.data属性
入口 serializer_obj.data
rest_framework/serializers.py/class Serializer/def data()
它是一个被包装成属性的方法,在方法中执行了父类的data方法,并且把父类.data的返回值转化成ReturnDict数据类型返回。
rest_framework/serializers.py/class BaseSerializer/def data()
红框内的部分实现了一种类似单例的模式,当序列化对象有_data属性的时候,直接返回,不调用函数,这就避免了资源的浪费,去重复执行一些函数(因为每一次执行的结果都是相同的)。它的实现方式是利用反射查找属性_data是否存在,如果不存在,把要返回的结果设置给_data属性,下次再调用data()函数的时候,就直接返回了self._data。
进入if语句中,只要self没有错误属性,且instance不为空或者有_validated_data属性,都会执行一个.to_representation的方法,只是传的参数不同。
rest_framework/serializers.py/class BaseSerializer/def __init__()
当我们序列化一个数据对象的时候,一般是直接位置传参,数据对象被参数instance接收,这个时候instance不为空,我们再看BaseSerializer的data方法。
rest_framework/serializers.py/class BaseSerializer/def data()
rest_framework/serializers.py/class Serializer/def to_representation()
真正进行序列化操作的是Serializer类重写的to_representation方法,它将每一个字段都进行了字段自己的校验,然后放入OrderDict有序字典中,再将有序字典返回。这个有序字典在Serializer的def data方法中用ReturnDict加工之后,就是最后的serializer_obj.data返回对象了。
五、Serializer校验相关
我们先大概看一些反序列化的过程。
rest_framework/serializers.py/class BaseSerializer/def __init__()
可以看到,序列化组件对象把传入的data直接赋值给了self的initial_data属性。
序列化入口 rest_framework/serializes.py/class BaseSerializer/def is_valid()
这里也是用了一种类似单例的模式,避免了重复校验,校验后的结果存放在self的_validated_data属性当中,生成校验后结果的函数是run_validation(),捕获异常,并把异常放在self._error当中,如果_error不为空且raise_exception的Boolean为True时,会直接抛异常。最后返回一个Boolean值。
rest_framework/serializes.py/class Serializer/def run_validation()
先调用to_internal_value返回一个value,再以value为参数分别执行run_validators和validate方法。最后返回的是valiate方法的返回值。
如果在我们自己写的序列化类中重写了全局钩子,也就是def validate(),那么最后一步就会执行我们自己写的全局钩子进行校验。如果没有就走模块自己的validate方法,这个方法没有进行任何操作,直接把传入的参数作为返回值返回了。
to_internal_value方法是局部钩子的校验。
rest_framework/serializes.py/class Serializer/def to_internal_value()
这是to_internal_value方法的部分源码,它先找了我们自己写的局部钩子校验的方法,然后将数据传入,校验后返回。传入的是单个的数据。
以上是Serializer相关的源码
Django-rest-framework源码分析(二)的更多相关文章
- Django rest framework源码分析(1)----认证
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- Django rest framework源码分析(一) 认证
一.基础 最近正好有机会去写一些可视化的东西,就想着前后端分离,想使用django rest framework写一些,顺便复习一下django rest framework的知识,只是顺便哦,好吧. ...
- Django rest framework源码分析(3)----节流
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- Django rest framework 源码分析 (1)----认证
一.基础 django 2.0官方文档 https://docs.djangoproject.com/en/2.0/ 安装 pip3 install djangorestframework 假如我们想 ...
- Django Rest Framework源码剖析(二)-----权限
一.简介 在上一篇博客中已经介绍了django rest framework 对于认证的源码流程,以及实现过程,当用户经过认证之后下一步就是涉及到权限的问题.比如订单的业务只能VIP才能查看,所以这时 ...
- Django搭建及源码分析(二)
上节针对linux最小系统,如何安装Django,以及配置简单的Django环境进行了说明. 本节从由Django生成的manage.py开始,分析Django源码.python版本2.6,Djang ...
- Django rest framework源码分析(4)----版本
版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...
- Django rest framework源码分析(2)----权限
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- Django Rest Framework源码剖析(三)-----频率控制
一.简介 承接上篇文章Django Rest Framework源码剖析(二)-----权限,当服务的接口被频繁调用,导致资源紧张怎么办呢?当然或许有很多解决办法,比如:负载均衡.提高服务器配置.通过 ...
- 3---Django rest framework源码分析(3)----节流
Django rest framework源码分析(3)----节流 目录 添加节流 自定义节流的方法 限制60s内只能访问3次 (1)API文件夹下面新建throttle.py,代码如下: # u ...
随机推荐
- Nginx使用和配置
概要: Nginx 简介 Nginx 架构说明 Nginx 基础配置与使用 Nginx 反向代理与负载均衡 Nginx 实现高速缓存 Nginx 性能参数调优 一.Nginx 简介与安装 Nginx ...
- 带你学习Javascript中的函数进阶(一)
1. 函数的定义和调用 1.1 函数的定义方式 函数声明方式function关键字(命名函数) 函数表达式(匿名函数) new Function() var fn = new Function('参数 ...
- 7-31 jmu-分段函数l (20 分)
本题目要求计算以下分段函数的值(x为从键盘输入的一个任意实数): 如果输入非数字,则输出“Input Error!” 输入格式: 在一行中输入一个实数x. 输出格式: 在一行中按”y=result”的 ...
- 网络编程模型(C/S模型和B/S模型)
目录 网络应用编程模型 互联网与企业内部网 早期计算机网络的通信模型 C/S模式 B/S模式 B/S 和 C/S 的区别 网络应用编程模型 互联网与企业内部网 网络的两个含义: 互联网 :互联网(In ...
- Electron打包H5网页为桌面运行程序
一.安装配置环境 Electron(一种桌面应用程序运行时),Electron 把 Chromium 和 Node 合并到一个单独的运行时里面,很适合开发桌面 web 形式的应用程序,通过Node它提 ...
- H5多列布局
多列布局 基本概念 1.多列布局类似报纸或杂志中的排版方式,上要用以控制大篇幅文本. 2.跨列属性可以控制横跨列的数量 /*列数*/ -webkit-column-count: 3; /*分割线*/ ...
- C++ non-const lvalue reference cannot bind to a temporary
1. 问题代码 #include <iostream> #include <vector> //注意begin和end形参都声明为引用 bool find_int(std::v ...
- MacOS麦克风输入监听的方法
Windows上很多人都知道,然而实际上并没什么用——延迟太大,根本没法用. MacOS上有两种方法: QuickTime Player新建音频录制(不需要真的录音),如下图: 这个方法和Window ...
- hadoop HDFS完全分布式搭建
1.准备阶段 准备好两台虚拟机(安装好hadoop,见:https://www.cnblogs.com/cjq10029/p/12336446.html),计划: IP 主机名 192.168.3.7 ...
- 深度学习与人类语言处理-语音识别(part1)
语音识别 语音识别该何去何从? 1969年,J.R. PIERCE:"语音识别就像把水变成汽油.从大海中淘金.治疗癌症.人类登陆月球" 当然,这是50年前的想法,那么语音识别该如何 ...