在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序列化器的序列化操作的更多相关文章

  1. DRF框架之Serializer序列化器的反序列化操作

    昨天,我们完成了Serializer序列化器的反序列化操作,那么今天我们就来学习Serializer序列化器的最后一点知识,反序列化操作. 首先,我们定要明确什么是反序列化操作? 反序列化操作:JOS ...

  2. IOSerialize,xml和json,soap序列化器,二进制序列化器,XML序列化器,文件 检查、新增、复制、移动、删除

    1 文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件3 三种序列化器4 xml和json1.文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/ ...

  3. 创建序列化器,序列化管理器,closureSerializer

    创建序列化器,序列化管理器,closureSerializer //通过反射创建序列化对象 // Create an instance of the class with the given name ...

  4. drf框架serializers中ModelSerializer类简化序列化和反序列化操作

    0905自我总结 drf框架serializers中ModelSerializer类 基于seriallizer类进行简化 https://www.cnblogs.com/pythonywy/p/11 ...

  5. django的rest framework框架——版本、解析器、序列化

    一.rest framework的版本使用 1.版本可以写在URL中,通过GET传参,如 http://127.0.0.1:8082/api/users/?version=v1 (1)自定义类获取版本 ...

  6. 一: DRF web应用框架基础,及序列化器的使用

    ---恢复内容开始--- 一: web 应用模式(有两种) 1: 前后端不分离(前端从后端直接获取数据) 2: 前后端分离 二: api 接口 原因一: 为了在团队内部形成共识.防止个人习惯差异引起的 ...

  7. DRF框架之ModelSerializer序列化器

    ModelSerializer是Serializer的子类,序列化和反序列化跟Serializer一样. ModelSerializer与常规的Serializer相同,但提供了: 基于模型类自动生成 ...

  8. DRF中的序列化器

    DRF中的序列化器详细应用   视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...

  9. 【DRF框架】序列化组件

    DRF框架的序列化组件 在前后端分离的应用模式中,后端仅返回前端所需的数据,返回的数据类似是JSON,因此需要使用序列化组件进行序列化再将数据返回 使用JsonResponse做序列化 #  使用Js ...

随机推荐

  1. 机器学习- Numpy基础 吐血整理

    Numpy是专门为数据科学或者数据处理相关的需求设计的一个高效的组件.听起来是不是挺绕口的,其实简单来说就2个方面,一是Numpy是专门处理数据的,二是Numpy在处理数据方面很牛逼(肯定比Pytho ...

  2. 20191107-4 beta week 2/2 Scrum立会报告+燃尽图 03

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9956 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶, ...

  3. python之面向对象中的多态

    直接看代码: class Dog: def __init__(self,name): self.name = name def play(self): print("%s在汪汪汪" ...

  4. 【题解】PKUWC2018简要题解

    [题解]PKUWC2018简要题解 Minimax 定义结点x的权值为: 1.若x没有子结点,那么它的权值会在输入里给出,保证这类点中每个结点的权值互不相同. 2.若x有子结点,那么它的权值有p的概率 ...

  5. 【题解】有标号的DAG计数3

    [HZOI 2015] 有标号的DAG计数 III 我们已经知道了\(f_i\)表示不一定需要联通的\(i\)节点的dag方案,考虑合并 参考[题解]P4841 城市规划(指数型母函数+多项式Ln), ...

  6. SimpleFactoryPattern(简单工厂模式)-----Java/.Net

    工厂模式是最常用的一种创建型模式,通常所说的工厂模式一般是指工厂方法模式.本篇是是工厂方法模式的“小弟”,我们可以将其理解为工厂方法模式的预备知识,它不属于GoF 23种设计模式,但在软件开发中却也应 ...

  7. ng-zorro-antd中踩过的坑

    ng-zorro-antd中踩过的坑 前端项目中,我们经常会使用阿里开源的组件库:ant-design,其提供的组件已经足以满足多数的需求,拿来就能直接用,十分方便,当然了,有些公司会对组件库进行二次 ...

  8. Python用PIL将PNG图像合成gif时如果背景为透明时图像出现重影的解决办法

    最近在用PIL合成PNG图像为GIF时,因为需要透明背景,所以就用putpixel的方法替换背景为透明,但是在合成GIF时,图像出现了重影,在网上查找了GIF的相关资料:GIF相关资料 其中有对GIF ...

  9. # "可插拔式"组件设计,领略组件开发的奥秘

    从一个 Confirm 组件开始,一步步写一个可插拔式的组件. 处理一个正常的支付流程(比如支付宝购买基金) 点击购买按钮 如果风险等级不匹配则:弹确认框(Confirm) 用户确认风险后:弹出支付方 ...

  10. linux搭建简单的web服务器

    主要想法是:使用虚拟机的Ubuntu系统搭建http服务器,然后在window的浏览器上测试 1.先测试windows和虚拟机上的ubuntu能否相互ping通 2.下载http.tar.gz并拷贝到 ...