Django-rest Framework(四)
序列化模块时rest-framework的很重要的组成部分
rest-framework序列化模块(核心)
一. 为什么要使用序列化组件?
后台的数据多以后台的对象存在,经过序列化后,就可以格式化成能返回给前台的数据
二. 序列化操作
视图类的三步操作
- ORM操作数据库拿到资源数据
- 格式化(序列化)成能返回给前台的数据
- 返回格式化后的的数据
视图类的序列化操作
- 直接将要序列化的数据传给序列化类
- 要序列化的数据如果是单个对象,序列化的参数many为False,数据如果是多个对象(list,queryset)序列化的参数many为True
序列化类
- model类中要反馈给前台的字段,在序列化类中要进行申明,属性名必须就是model的字段名,且Field类型也要保持一致(不需要明确规则)
- model类中不需要反馈给前台的字段,在序列化类中不需要声明(省略)
- 自定义序列化字段用 SerializerMethodField() 作为字段类型,该字段的值来源于get_自定义字段名(self,obj)方法的返回值
三. 反序列化
视图类的三步操作
- 从请求对象中拿到前台的数据
- 校验前台数据是否合法
- 反序列化成后台model对象与数据库交互
视图类的反序列化操作
- 将要反序列化的数据传给序列化类的data参数
- 将反序列化的数据如果是单个字典,反序列化的参数many为False,数据如果是多个字典的列表,反序列化的参数many为True
反序列化类
- 系统的字段,可以在Field类型中设置系统校验规则(name=serilizers.CharField(min_length=3))
- required校验规则绝对该字段时必校验还是可选校验字段(默认required为True,数据库字段有默认值或可以为空的字段required可以赋值为False)
- 但是需要在自定义校验规则中(局部\全局钩子) 将自定义反序列化字段取出(返回剩余的数据与数据库交互)
- 局部钩子的方法命名 validate_属性名(self,属性的value),校验规则为 成功返回属性的value 失败抛出校验错误的异常
- 全局钩子的方法命名 validate(self,所有属性attrs),校验规则为 成功返回attrs 失败抛出校验错误的异常
三. 序列化三个类
Serializer类(了解) --偏底层,开发效率不高
ModelSerializer类(重中之重) --开发运用阶段才有的序列化方式,开发效率高
ListSerializer类(正常) --完成群增,群改接口的辅助序列化类
ModelSerializer代码分析
#先导入ModelSerializer类
from rest_framework import ModelSerializer
from rest_framework impoert Serializers
# 自定义反序列化字段,校验规则只能在声明自定义反序列化字段时设置,且一定是write_only
re_pwd = serializers.CharField(min_length=3,max_length=64,writ_only=True) #写一个类继承 ModelSerializer类 这里以User类为例
class UserModelSerializer(ModelSerializer): re_pwd =
class Meta:
# 将序列化类与Model类进行绑定
models = model.User # 1. 设置序列化与反序列化的所有字段(并划分序列化字段和反序列化字段 列表里面默认的是序列化和 反序列化都参与(在你的orm类中没有默认字段的情况下,如果有默认值或空,就不参与反序列化)) #2. 必须在orm中的字段 或者是自定义反序列化字段
fields = ['name','pwd','re_pwd','age','gender']
extra_kwargs = {
'name' :{
'required':True, #设置不能为空
'min_lenght':3, #设置最短不能短于三位
'error_messages':{ #自定义错误信息
'min_length':'用户名最短不能短于三位'
}
},
'age':{
'min_value':0 #设置最小值
},
'pwd':{
'required':True,
'write_only':True # 只参与反序列化
},
'gender':{
'read_only':True #只参与序列化
#如果orm类字段中存在 choices 类型
# 自定义插拔序列化字段:替换了在Serializer类中自定义的序列化字段 (SerializerMethodField)
# 自定义插拔序列化字段一定不参与反序列化过程
#@property
#def gender(self):
#return self.get_sex_display()
}
} #局部钩子 使用 validata_字段名
def validata_name(self,value): #value = name的值
if 'g' in value.lower(): #判断name的值中是否存在g
raise serializer.ValidationError('报错信息') #如果不满足条件 就抛出错误信息
return value #这里值要返回出去 #全局钩子 判断两次密码是否一致
def validata(self.attrs) #attrs就是你列表字段里面的所有的值
pwd = attrs.get('pwd')
re_pwd = attrs.pop('re_pwd')
if pwd != re_pwd:
# 不一致 就抛异常
raise serializers.ValidationError({'re_pwd': '两次密码不一致'})
#返回attrs
return attrs
总结:
序列化与反序列功能可以整合成一个类,该类继承了ModelSerializer
继承ModelSerializer类的资源序列化类,内部包含三部分
Meta子类 局部钩子 全局钩子
注: create和update方法ModelSerializer已经重写了,使用不需要重写
在Meta子类中
- 用model类绑定关联的model类
- 用fields来这是所有的序列化 反序列化字段
- 用extra_kwargs来设置系统的校验规则
重要的字段校验规则:
- read_only校验规则: 代表该字段只参与序列化
- write_only校验规则: 代表该字段只参与反序列化
- required校验规则: 代表该字段在反序列化是否是必填(True) 还是选填(False),不能和read_only一起使用(规则冲突)
- 细节1: 如果一个字段有默认值或者是可以为空,没这只required规则,默认是False,反之,默认为True
- 细节2 如果一个Model字段没有设置read_only也没有设置 write_only 该字段默认参与序列化和反序列化
自定义序列化字段:在Model类中,定义方法属性(可以返回特殊值,还可以完成连表操作),在序列化类的fields属性中可以选择性插拔
自定义反序列化字段: 在Serializer类中,自定义校验字段,校验规则也只能在声明字段时设置,自定义的反序列化字段(如re_pwd),必须设置write_only为True
Django-rest Framework(四)的更多相关文章
- Django REST framework+Vue 打造生鲜超市(四)
五.商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django res ...
- Django Rest Framework源码剖析(四)-----API版本
一.简介 在我们给外部提供的API中,可会存在多个版本,不同的版本可能对应的功能不同,所以这时候版本使用就显得尤为重要,django rest framework也为我们提供了多种版本使用方法. 二. ...
- 利用 Django REST framework 编写 RESTful API
利用 Django REST framework 编写 RESTful API Updateat 2015/12/3: 增加 filter 最近在玩 Django,不得不说 rest_framewor ...
- Django REST framework使用ViewSets的自定义路由实现过程
在Django中使用基于类的视图(ClassView),类中所定义的方法名称与Http的请求方法相对应,才能基于路由将请求分发(dispatch)到ClassView中的方法进行处理,而Django ...
- Django REST framework+Vue 打造生鲜超市(一)
一.项目介绍 1.1.掌握的技术 Vue + Django Rest Framework 前后端分离技术 彻底玩转restful api 开发流程 Django Rest Framework 的功能实 ...
- Django REST framework+Vue 打造生鲜超市(三)
四.xadmin后台管理 4.1.xadmin添加富文本插件 (1)xadmin/plugins文件夹下新建文件ueditor.py 代码如下: # xadmin/plugins/ueditor.py ...
- Django REST framework+Vue 打造生鲜超市(五)
六.商品类别数据展示 6.1. 商品类别数据接口 (1)商品分类有两个接口: 一种是全部分类:一级二级三级 一种是某一类的分类以及商品详细信息: 开始写商品分类的接口 (2)序列化 给分类添加三级分类 ...
- Django REST framework+Vue 打造生鲜超市(十二)
十三.首页.商品数量.缓存和限速功能开发 13.1.轮播图接口实现 首先把pycharm环境改成本地的,vue中local_host也改成本地 (1)goods/serializer class B ...
- Django rest framework源码分析(1)----认证
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- django rest framework serializers
django rest framework serializers序列化 serializers是将复杂的数据结构变成json或者xml这个格式的 serializers有以下几个作用:- 将qu ...
随机推荐
- MVC到底是设计模式还是一种框架还是一种架构? https://www.zhihu.com/question/31079945
具体知乎讨论内容:https://www.zhihu.com/question/31079945 MVC到底是设计模式还是一种框架还是一种架构? 我认为它是3种设计模式的演变和组合:观察者模式(Obs ...
- 阿里云CentOs7上安装JDK
一.查看服务器是否已经预装了JDK 在拿到新机器以后,要先看下机器上是否已经预装了JDK,命令: rpm -qa|grep jdk 如果有的话,卸载openjdk(无需输全称).命令: yum -y ...
- 洛谷P1792——[国家集训队]种树
传送门:QAQQAQ 题意:$n$个点中选$m$个不相邻的点,使得这些点不相邻(1和n算相邻),求这些点的最大值 思路:这不是神仙题不是神仙题…… 刚看到这题觉得不难,好像只要贪心就可以了但贪心不知从 ...
- uploadify上传附件 点击保存无效 切F12就可以正常保存
感谢 这篇文章 https://blog.csdn.net/koala25/article/details/70230046 uploadify上传附件 点击保存无效 切F12就可以正常保存了, ...
- [Neo4j] 添加算法插件包
下载graph-algorithms-algo-xxx.jar包,我下的是3.5.3.1,放到neo4j目录的plugins文件夹下 修改 conf目录下的配置文件 neo4j.conf ,加一行: ...
- 《代码整洁之道》ch1~ch4读书笔记 PB16110698 (~3.8 第一周)
<代码整洁之道>ch1~ch4读书笔记 <clean code>正如其书名所言,是一本关于整洁代码规范的“教科书”.作者在书中通过实例阐述了整洁代码带来的种种利处以及混乱代码 ...
- JS规则 编程练习 考考大家的数学,计算以下计算公式的结果。然后在浏览器中运行一下,看看结果是否跟你的结果一致。
编程练习 考考大家的数学,计算以下计算公式的结果.然后在浏览器中运行一下,看看结果是否跟你的结果一致. 任务 第一步: 在 ? 处填写你的答案. 第二步: 填写完成后,运行一下,看看是不是跟你填写的 ...
- Dash Speed【好题,分治,并查集按秩合并】
Dash Speed Online Judge:NOIP2016十联测,Claris#2 T3 Label:好题,分治,并查集按秩合并,LCA 题目描述 比特山是比特镇的飙车圣地.在比特山上一共有 n ...
- 为什么不直接使用socket ,还要定义一个新的websocket 的呢
大致概念: TCP/IP 协议,是网络七层协议的第四层,本身没有长连接或短连接的区别: HTTP 是基于 TCP 协议之上的「短连接」应用层协议,它的出现极大简化了网络应用的实现门槛,丰富了应用: S ...
- JAVA-第一课 环境的配置
首先 我们需要 下载java的开发工具包 jdk jdk 的下载地址::http://www.oracle.com/technetwork/java/javase/downloads/index.h ...