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 ...
随机推荐
- 吐槽苹果开放接口のappleid登陆
这里吐槽一下苹果的开发文档,一切源于前段时间,公司的产品app(某知名资讯app)要接入苹果登陆(ios13发布以来,apple就流氓要求新上线的app,如果有第三方登陆的话,必须要接入appleid ...
- Dart的JIT 与 AOT
JIT:Just In Time AOT:Ahead of Time 含义: 目前,程序主要有两种运行方式:静态编译与动态解释. 静态编译的程序在执行前全部被翻译为机器码,通常将这种类型称为AOT ( ...
- python版md-to-html编辑器
用PyQt5封装python-markdown,支持自定义样式. 详情:https://blog.phyer.cn/article/4523
- 微信小程序学习 动手撸一个校园网小程序
动手撸一个校园网微信小程序 高考完毕,想必广大学子和家长们都在忙着查询各所高校的信息,刚好上手微信小程序,当练手也当为自己的学校做点宣传,便当即撸了一个校园网微信小程序. 效果预览 源码地址:Gith ...
- 前端每日实战:160# 视频演示如何用纯 CSS 创作一个打开内容弹窗的交互动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/GYXvez 可交互视频 此视频是可 ...
- 基础JavaScript练习(三)总结
任务目的 实践JavaScript数组.字符串相关操作 任务描述 基于任务四进行升级 将新元素输入框从input改为textarea 允许一次批量输入多个内容,格式可以为数字.中文.英文等,可以通过用 ...
- deepin中安装pycharm过程
安装过程真的超级简单!一遍就会! 1.下载pycharm(下载地址):https://www.jetbrains.com/pycharm/ 2.在网址中找到对应的版本:在deepin中选择linux版 ...
- 小白的springboot之路(十六)、mybatis-plus 的使用
0-前言 mybatis plus是对mybatis的增强,集成mybatis plus后,简单的CRUD和分页就不用写了,非常方便,五星推荐: 1-集成 1-1.添加依赖 <!-- .集成my ...
- python之三元表达式,列表|字典推导式,函数对象
#### 三元表达式: 就是if....else...的语法糖 # -- 1) 只能解决if...else...结构,其他if分支结构都不管 # -- 2)一个分支提供一个结果: 如果一个分支提供了多 ...
- 在Tomcat上发布Web项目的方式
一. Tomcat的使用: 安装:解压压缩包即可 注意:安装目录不能有中文 目录结构: ①bin:可执行文件 ②conf:可执行文件 ③lib:依赖的jar包 ④logs:日志文件 ⑤:temp:临时 ...

