序列化器的理解

其实就是Django RESTful Framework

RESTful一种API的命名风格,主要因为前后端分离开发出现

前后端分离: 用户访问静态文件的服务器,数据全部由ajax请求给到

RESTful风格:数据应该是名词,而动词由HTTP的请求方式来体现

RESTful风格的API给前端返回 结果对象,无论什么请求方式

”’ 特点: 反复重复 
因为不论什么请求方式,都需要给前端返回对象内容,就是json格式的 
所以每次如果有查询的结果对象都需要遍历成字典,和flask相同

如果不是get请求是带有内容的请求,那从前端接收的是json格式 
每次都需要从request.body中拿出内容,是bytes格式 
然后decode解码成json字符串然后再loads成可以给python处理的字典 
”’

”’ 
说明: 
return JsonResponse(book_list, safe=False)

对safe的说明,我们传过去的book_list是一个list格式

在前端json支持{}格式也支持[]格式

但是django中认为[]的json格式是不安全的会进行校验

所以把safe选项关闭False,不进行校验就可以传[]

”’

”’ 
序列化:对查询结果进行遍历,然后转成字典,给到JsonResponse 
反序列化:接收前端json处理成字典,然后校验 
”’

”’ 
1.DRF框架工程搭建,建立在django的基础上 
安装DRF: pip install djangorestframework 
注册DRF: INSTALLED_APPS = [‘rest_framework’,] 
在子应用中serializers.py创建序列化器,用于执行序列化和反序列化 
在views中类视图使用序列化器,在urls中写地址 
”’

”’ 
2.序列化器: serializer

定义: 其实ModelSerializer是Serializer的子类,更方便有模型类的序列化器的创建,实际产生的序列化器如下 
class BookInfoSerializer(serializers.Serializer): 实际继承Serializer 
“”“图书数据序列化器”“” 序列化器:执行序列化和反序列化 
id = serializers.IntegerField(label=’ID’, read_only=True) read_only:只在输出响应中使用,就是给前端的时候,而前端给我们传请求的时候,不做验证 
btitle = serializers.CharField(label=’名称’, max_length=20) 
bpub_date = serializers.DateField(label=’发布日期’, required=False) 
bread = serializers.IntegerField(label=’阅读量’, required=False) 
bcomment = serializers.IntegerField(label=’评论量’, required=False) 
image = serializers.ImageField(label=’图片’, required=False)

字段 : 跟模型类创建很相似,具体存在的字段见讲义 还有常用的参数(就是约束)

使用: 创建对象 serializer = Serializer(instance=None, data=empty, **kwarg) 
说明: 序列化时,将模型类对象传入instance参数 instance = 序列化对象 
反序列化时,将要被反序列化的数据传入data参数 data = 反序列化对象 
可通过context参数额外添加数据 即 **kwarg : context={‘request’: request} 通过Serializer对象的context属性获取 
”’

”’ 
3.序列化操作 : 其实就是查询到对象之后,遍历构造字典的过程,而JsonResponse由内置的 Renderer渲染器来执行

3-1.序列化只使用序列化器对象的第一个参数instance 
serializer = BookInfoSerializer(instance = book) 
通过data属性可以获取序列化后的数据,这个data跟第二个参数可不是一个 
serializer.data

{‘id’: 2, ‘btitle’: ‘天龙八部’, ‘bpub_date’: ‘1986-07-24’, ‘bread’: 36, ‘bcomment’: 40, ‘image’: None}

3-2.如果要被序列化的是包含多条数据的查询集QuerySet,添加many=True参数 
book_qs = BookInfo.objects.all() 
serializer = BookInfoSerializer(book_qs, many=True) 
serializer.data 
”’

”’ 
4.关联对象嵌套序列化(由hero->book通过 hbook方法)

4-1.hbook是个外键: PrimaryKeyRelatedField 
hbook = serializers.PrimaryKeyRelatedField(label=’图书’, read_only=True) 
因为是外键,第二个位置必须有read_only=True 或者 查询集 queryset=BookInfo.objects.all() 要不报错 
serializer.data 序列化的时候 结果是 关联对象的主键 {‘hbook’: 2} 即 book.id

4-2.因为id不直观,想要详细内容的字符串,把外键字段改为 : StringRelatedField 
hbook = serializers.StringRelatedField(label=’图书’) 
结果: {‘hbook’: ‘天龙八部’}

4-3.接口链接: HyperlinkedRelatedField 
hbook = serializers.HyperlinkedRelatedField(label=’图书’, read_only=True, view_name=’books-detail’) 
必须指明view_name参数,以便DRF根据视图名称寻找路由,进而拼接成完整URL 这个view_name传什么:url中有1个参数,是命名空间,是跟它关联 
结果: {‘hbook’: ‘http://127.0.0.1:8000/books/2/‘}

4-4.关联对象的指定字段数据 : SlugRelatedField 
hbook = serializers.SlugRelatedField(label=’图书’, read_only=True, slug_field=’bpub_date’) 
slug_field指明使用关联对象的哪个字段 
结果:{‘hbook’: datetime.date(1986, 7, 24)}

4-5.使用关联对象的序列化器: 直接把所属book的所有内容序列化 
hbook = BookInfoSerializer() 
结果:{‘hbook’: OrderedDict([(‘id’, 2), (‘btitle’, ‘天龙八部’)te’, ‘1986-07-24’), (‘bread’, 36), (‘bcomment’, 40), (‘image’, None)])}

原文地址:https://www.cnblogs.com/denix-32/p/9895391.html

时间: 2024-10-27 06:33:46

序列化器的理解的相关文章

Java Serializable(序列化)的理解和总结、具体实现过程(转)

原文地址:http://www.apkbus.com/forum.php?mod=viewthread&tid=13576&fromuid=3402 Java Serializable(序列化)的理解和总结.具体实现过程 内存中的对象是怎么存在的?  内存中各种对象的状态是?  实例变量是什么(指的是实例化的对象吗)?    使用序列化的好处是什么? 1.序列化是干什么的?        简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出

序列化器:ModelSerializer

ModelSerializer 类提供了一个快捷方式,可让你基于 Models 自动创建一个 Serializer 类,其中的字段与模型类字段对应. ModelSerializer 类与常规 Serializer 类相同,不同之处在于: 它会根据模型自动生成一组字段. 它会自动为序列化类生成验证器,例如 unique_together 验证器. 它包含 .create() 和 .update() 的简单默认实现. 声明 ModelSerializer 如下所示: from rest_framew

关于定义序列化器时,read_only和write_only有什么作用

关于序列化和反序列化 ? 在谈论前,先说一下序列化和反序列化,这两个概念最初是在学习json的时候提出来的,回头来看,其实可以用最初的理解就可以了 序列化就是将对象转化方便传输和存储字节序列,例如json.dumps就是序列化(狭义的序列化,将字典转化为json字符串),这样得到的json字符串不仅直接可以在其他语言使用(跨平台比较好),而且可以在前后端进行传输交互(drf序列化器) 反序列化恰恰相反,而是将字节序列转化为对象,json.loads是将json字符串转化为字典,是狭义的反序列化(

使用XML序列化器生成XML文件和利用pull解析XML文件

首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message> <sms> <body> 陈驰0 </body> <date> 1462162910995 </date> <address> 1380 </address> <type> 1 </type> &

javaScript中JSON序列化器/解析器

在JSON库中有一个全局的JSON对象, 包括两2个方法:序列化器即parse() 和 解析器stringify() 下面就介绍一个这两个方法的使用: 1.parse()用于将JSON字符串解析为对象或数组 var jsonText = '{"userName":"zhangsan","password":"123456"}';//注:  每个属性名和值都要用双引号, 单引号写在外面, 否则会出现异常. var changeJ

python之我对装饰器的理解

从一开始学习python的时候,就一直不是很理解装饰器是个什么东东,再看了很多篇博文和自己动手敲了好多代码后,算是略有了解. 我理解的装饰器是: 在不改变原有函数调用的情况下,对其进行包装,使其变成另外一种函数来使用,一般的用途是 插入日志.性能测试.事务处理等. def host_restrict(tags=[], names=[]):     def decorator(f):         @functools.wraps(f)         def decorated(*args, 

NetworkComms V3 使用Json序列化器进行网络通信

刚才在网上闲逛,偶然看到一篇文章 C#(服务器)与Java(客户端)通过Socket传递对象 网址是:http://www.cnblogs.com/iyangyuan/archive/2012/12/23/2829712.html#3140522 其中提到了 C#与java如通过传递对象通信的问题 摘引如下: 通信关键: C#和java用Socket通信,发送数据和接收数据可以统一采用UTF-8编码,经过测试,使用UTF-8编码可以成功传递对象. 对于Socket技术,发送数据之前,一般将字符串

[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考

最近写一个py脚本来整理电脑中的文档,其中需要检校输入的字符,为了不使代码冗长,想到使用装饰器. 上网搜索有关python的装饰器学习文档,主要看的是AstralWind的一篇博文,以及Limodou的一篇文章.作为初学者,这两篇文章对新手有很大的帮助,但仍然有些不易理解的地方.因此在此以一个初学者的认知记录一下python的装饰器的学习心得. 1. 什么是装饰器? 顾名思义,装饰器就是在方法上方标一个带有@符号的方法名,以此来对被装饰的方法进行点缀改造. 当你明白什么是装饰器之后,自然会觉得这

Android 使用xml序列化器生成xml文件

在<Android 生成xml文件>一文中使用流的形式写入xml格式文件,但是存在一定的问题,那就是在短信内容中不能出现<>之类的括号,本文使用xml序列化器来解决 xml序列化器对象 XmlSerializer xs = Xml.newSerializer();* 给序列化器设置输出流 File file = new File(Environment.getExternalStorageDirectory(), "backupsms.xml"); FileOu