DRF框架之Serializer序列化器的序列化操作
在DRF框架中,有两种序列化器,一种是Serializer,另一种是ModelSerializer.
今天,我们就先来学习一下Serializer序列化器。
使用Serializer序列化器的开发步骤:
1. 定义Serializer序列化器
首先,我们要在子应用中,创建见一个serializers.py文件,用来编写Serializer序列化器代码。
from rest_framework import serializers
# 定义序列化器 class BookInfoSerializer(serializers.Serializer):
'''定义图书序Serializer序列化器'''
# 这里的字段需要和模型类中的字段名、字段类型、约束一致
id = serializers.IntegerField(label='ID', read_only=True)
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)
2. 使用序列化器对数据进行操作。
既然,说到要对数据进项操作,那么,可想而知,就一定分为序列化和反序列化两种操作。
首先呢,我们先来明确一下什么叫做序列化操作?
序列化操作:模型数据 --> 字典数据 --? JOSN数据
序列化操作:
单个模型数据的序列化操作:序列化器名称(instance='模型数据')
查询集模型数据的序列化操作:序列化器名称(instance='模型数据集', many=True) ---> many的意思就是告诉序列化器这是一个查询集。
Shell测试代码如下:
>>> from booktest.models import BookInfo
>>> from booktest.serializers import BookInfoSerializer
>>> book = BookInfo.objects.get(id=2)
>>> book
<BookInfo: 天龙八部>
>>> s = BookInfoSerializer(instance=book)
>>> s.data
{'bread': 36, 'btitle': '天龙八部', 'bpub_date': '1986-07-24', 'id': 2, 'bcomment': 40}
>>> books = BookInfo.objects.all()
>>> s = BookInfoSerializer(instance=books, many=True)
>>> s.data
[OrderedDict([('id', 1), ('btitle', '射雕英雄传'), ('bpub_date', '1980-05-01'), ('bread', 12), ('bcomment', 34)]), OrderedDict([('id', 2), ('btitle龙八部'), ('bpub_date', '1986-07-24'), ('bread', 36), ('bcomment', 40)]), OrderedDict([('id', 3), ('btitle', '笑傲江湖'), ('bpub_date', '1995-12-24read', 20), ('bcomment', 80)]), OrderedDict([('id', 4), ('btitle', '雪山飞狐'), ('bpub_date', '1987-11-11'), ('bread', 58), ('bcomment', 24)]), OrdDict([('id', 9), ('btitle', '西游记'), ('bpub_date', '2020-02-05'), ('bread', 18), ('bcomment', 7)])]
关联对嵌套序列化:
多对一嵌套序列化操作:在序列化多关系模型数据时,也要将一关系模型数据序列化出来。
首先,我们需要定义一个多关系模型的序列化器。
class HeroInfoSerializer(serializers.Serializer):
"""英雄数据序列化器""" GENDER_CHOICES = (
(0, 'male'),
(1, 'female')
)
id = serializers.IntegerField(label='ID', read_only=True)
hname = serializers.CharField(label='名字', max_length=20)
hgender = serializers.ChoiceField(label='性别', choices=GENDER_CHOICES, required=False)
hcomment = serializers.CharField(label='描述信息', max_length=200, required=False, allow_null=True)
因为,我们要进行嵌套序列化操作,所以,需要在多关系模型中补充对一关系模型的关联字段。
其中,分为以下三种情况:
1. 使用外键id作为关联(serializers.PrimaryKeyRelatedField):在多模型数据序列化时,会将对应的一关系模型数据的主键id序列化出来。
2. 使用一关系模型类中的str方法做关联(serializers.StringRelatedField):表示使用一模型类中的__str__方法的返回值作为关联,序列化出来的数据是多关系模型序列化后的数据和str方法的返回值。(几乎不被使用)
3. 使用一关系模型类的序列化器做关联(BookInfoSerializer()):在多关系模型数据序列化时,会将对应的一关系模型数据全部序列化出来
需要,在多关系模型序列化器中补充的代码如下:
# 补充多对一查询关联字段
# PrimaryKeyRelatedField:表示当前表中的外键,通过这种方式序列化出来的为外键ID
hbook = serializers.PrimaryKeyRelatedField(read_only=True, label='主键') # StringRelatedField:表示使用模型类中的__str__方法,返回的值作为关联,序列化出来的数据是str方法的返回值
hbook = serializers.StringRelatedField(read_only=True, label='图书') # BookInfoSerializer:以关联模型类的序列化器作为关联,序列化出来的数据是关联对象的所有数据
hbook = BookInfoSerializer()
一对多的嵌套序列化操作:在序列化一关系模型数据时,将多关系模型的数据也序列化出来。
我们已经在上面定义过了一个一关系模型的序列化器了,我们直接复用就可以。
同样,我们也需要对一关系模型序列化器中补充一关系模型对多关系模型的关联字段。
其中,和多对一序列化一样,也是分为三种情况(但是,我们只需要记住使用外键id作为关联字段即可):
使用外键id作为关联(serializers.PrimaryKeyRelatedField):在一模型数据序列化时,会将对应的多关系模型数据的主键id序列化出来。
需要,在一关系模型序列化器中补充的代码如下:
# 补充一对多关联对象序列化字段
# 多方类名小写_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True),序列化的是关联对象的id
heroinfo_set = serializers.PrimaryKeyRelatedField(label='英雄',read_only=True, many=True)
至此,我们的Serializer序列化器的序列化操作就讲完啦。
那么,接下来我们就要进行反序列化操作的学习啦。
DRF框架之Serializer序列化器的序列化操作的更多相关文章
- DRF框架之Serializer序列化器的反序列化操作
昨天,我们完成了Serializer序列化器的反序列化操作,那么今天我们就来学习Serializer序列化器的最后一点知识,反序列化操作. 首先,我们定要明确什么是反序列化操作? 反序列化操作:JOS ...
- IOSerialize,xml和json,soap序列化器,二进制序列化器,XML序列化器,文件 检查、新增、复制、移动、删除
1 文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件3 三种序列化器4 xml和json1.文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/ ...
- 创建序列化器,序列化管理器,closureSerializer
创建序列化器,序列化管理器,closureSerializer //通过反射创建序列化对象 // Create an instance of the class with the given name ...
- drf框架serializers中ModelSerializer类简化序列化和反序列化操作
0905自我总结 drf框架serializers中ModelSerializer类 基于seriallizer类进行简化 https://www.cnblogs.com/pythonywy/p/11 ...
- django的rest framework框架——版本、解析器、序列化
一.rest framework的版本使用 1.版本可以写在URL中,通过GET传参,如 http://127.0.0.1:8082/api/users/?version=v1 (1)自定义类获取版本 ...
- 一: DRF web应用框架基础,及序列化器的使用
---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...
- DRF框架之ModelSerializer序列化器
ModelSerializer是Serializer的子类,序列化和反序列化跟Serializer一样. ModelSerializer与常规的Serializer相同,但提供了: 基于模型类自动生成 ...
- DRF中的序列化器
DRF中的序列化器详细应用 视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...
- 【DRF框架】序列化组件
DRF框架的序列化组件 在前后端分离的应用模式中,后端仅返回前端所需的数据,返回的数据类似是JSON,因此需要使用序列化组件进行序列化再将数据返回 使用JsonResponse做序列化 # 使用Js ...
随机推荐
- vue-cli项目中使用axios
前言 前后端数据交互中,我们使用最多的就是jQuey中的ajax进行数据交互,但是随着大前端日益的扩大,越来越多的库和框架也渐渐的出现在前端开发人员面前,而本编博客需要介绍的就是在vue-cli项目中 ...
- 美团面试官问我一个字符的String.length()是多少,我说是1,面试官说你回去好好学一下吧
本文首发于微信公众号:程序员乔戈里 public class testT { public static void main(String [] args){ String A = "hi你 ...
- 多vps管理面板
iis7远程桌面连接工具,又叫做iis7远程桌面管理软件,是一款绿色小巧,功能实用的远程桌面管理工具,其界面简洁,操作便捷,能够同时远程操作多台服务器,并且多台服务器间可以自由切换,适用 ...
- 《美国纽约摄影学院摄影教材》PDF教材
下载地址: 美国纽约摄影学院摄影教材(上册).pdf 美国纽约摄影学院摄影教材(下册).pdf 欢迎你到纽约摄影学院来,我们急切地等待着开课,你们也在 跃跃欲试了.那就让我们马上开始吧! 你已 ...
- 「Luogu P3183」[HAOI2016]食物链 解题报告
身为一个蒟蒻,由于刷不过[NOI2001]食物链 于是出门左转写了道另一道假的食物链 戳这里 这里的食物链个条数其实就是有向图的路径数(应该是这么说吧,我弱) 思路: 拓扑(Topulogy)(一本正 ...
- Linux下离线安装gdb及常用命令汇总
以redhat6.5虚拟机作为例子,由于工作性质,大部分情况linux的软件安装,是采用离线方式的. 1.离线安装gdb 像gcc.g++或者gdb这种常用的工具软件,一般虚拟机都会安装的,如未安装, ...
- 用TensorFlow做图像识别(python)
一.TensorFlow简介 TensorFlow是由谷歌开发的一套机器学习的工具,使用方法很简单,只需要输入训练数据位置,设定参数和优化方法等,TensorFlow就可以将优化结果显示出来,节省了很 ...
- Java 中级 学习笔记 1 JVM的理解以及新生代GC处理流程
写在最前 从毕业到现在已经过去了差不多一年的时间,工作还算顺利,但总是离不开CRUD ,我觉得这样下去肯定是不行的,温水煮青蛙,势必有一天,会昏昏沉沉的迷失在温水里.所以,需要将之前学习JAVA 当中 ...
- java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍
pinyin pinyin 是 java 实现的高性能中文拼音转换工具. 变更日志 创作目的 想为 java 设计一款便捷易用的拼音工具. 如何为 java 设计一款高性能的拼音转换工具 pinyin ...
- 每天玩转3分钟 MyBatis-Plus - 2. 普通查询
每天玩转3分钟 MyBatis-Plus - 1. 配置环境 每天玩转3分钟 MyBatis-Plus - 2. 普通查询 mybatis-plus的查询功能非常强大, 这一篇,我们来看下mybati ...