序列化与反序列化

1.序列化

概念:将程序中的一个数据结构类型转化为其它格式(字典、json、XML等)。例如:将 django 中的模型类对象转换为json字符串,这个转换过程称之为序列化
序列化时机:当需要给前端响应模型数据时,需要将模型数据序列化成前端需要的格式

2.反序列化

概念:将其它格式 (字典、json、XML等)转换为程序中的数据,例如:将json字符串转换为 django 中的模型类对象,这个过程称之为反序列化
反序列化时机:当需要将用户发送的数据存储到数据库之前,需要使用反序列化

3.开发Restful接口

视图中做的最主要的三件事:

  • 将请求的数据(如:Json格式)转换为模型类对象(反序列化)
  • 操作数据库
  • 将模型类对象转换为响应的数据(如:Json格式)(序列化)

在视图中需要做的最核心的事:

  • 将数据库数据序列化为前端所需要的格式,并返回
  • 将前端发送的数据反序列化为模型类对象,并保存到数据库中

常用序列化器类

1.serializers.Serializer

应用下先创建一个名为 serializers.py 的模块,在该模块下需要引入 serializers 模块,并创建序列化器类 ProjectsSerializer 继承 serializers.Serializer 父类

from rest_framework import serializers
class ProjectSerializer(serializers.Serializer):name = serializers.CharField(max_length=200, label="项目名称", help_text='项目名称')leader = serializers.CharField(max_length=50, label="项目负责人", help_text='项目负责人')programmer = serializers.CharField(max_length=50, label="开发人员", help_text="开发人员")tester = serializers.CharField(max_length=50, label="测试人员", help_text="测试人员")

字段说明

  • max_length:最大长度:在反序列化时进行输入最大长度校验
  • min_length :最小长度:在反序列化时进行输入最小长度校验
  • allow_blank:是否允许为空:在反序列化时允许传空白字符串,默认不允许
  • max_value:最大值:在反序列化时进行输入最大值校验
  • min_value:最小值:在反序列化时进行输入最小值校验
  • read_only:表明该字段仅用于序列化输出,但在反序列化验证时不做校验,默认 False
  • write_only:表明该字段仅用于反序列化输入,但在序列化时不进行输出,默认 False
  • required:表明该字段在反序列化时必须输入,序列化时必须输出,默认 True
  • default:反序列化时使用的默认值,如果不指明,在传递时默认值为 0
  • allow_null:表明该字段是否允许传入 None,默认 False
  • validators :该字段使用的验证器
  • error_messages:包含错误编号与错误信息的字典
  • label:用于HTML展示API页面时,显示的字段名称,相当于模型类字段的 verbose_name 属性
  • help_text:用于HTML展示API页面时,显示的字段帮助提示信息

序列化模型类对象

在视图类模块下,返回的为模型类对象时,使用步骤如下:

  • 实例化一个序列化器类,将模型类对象传给 instance 变量,并返回一个序列化器类对象
  • 调用序列化器类对象的 data 属性后传入 JsonResponsereturn
obj = Projects.objects.get(id__exact=pk)
serializer_obj = ProjectSerializer(instance=obj)
return JsonResponse(serializer_obj.data)

序列化查询集

在视图类模块下,返回的为查询集时,使用步骤如下:

  • 实例化一个序列化器类,将模型类对象传给 instance 变量,并且设置 many=True,并返回一个序列化器类对象
  • 调用序列化器类对象的 data 属性后传入 JsonResponse ,设置 safe=False ,并 return

自定义create和update方法

def create(self, validated_data):# validated_data参数为校验通过之后的数据# 必须将创建成功的模型类对象返回obj = Projects.objects.create(**validated_data)return objdef update(self, instance, validated_data):# instance为待更新的模型类对象# validated_data参数为校验通过之后的数据# 必须将更新成功的模型类对象返回instance.name = validated_data.get('name') or instance.nameinstance.leader = validated_data.get('leader') or instance.leaderinstance.tester = validated_data.get('tester') or instance.testerinstance.programmer = validated_data.get('programmer') or instance.programmerinstance.desc = validated_data.get('desc') or instance.descinstance.save()return instance

2.serializers.ModelSerializer

应用下先创建一个名为 serializers.py 的模块,在该模块下需要引入 serializers 模块,并创建序列化器类 ProjectsModelSerializer 继承 serializers.ModelSerializer 父类

特性

  • filed 字段可以不需要自己写,与模型一一对应

  • ModelSerializer 中定义了与本来需要序列化字段同名的字段,会覆盖原来的模型类映射的字段

  • 简单的实现了 createupdate 方法,可根据需求重写。调用父类的 creatupdate 方法时,validated_data 不需要解包

    # update
    super().update(instance, validated_data)
    # create
    super().create(validated_data)
    

自定义Meta参数属性

  • mode关联的模型类

  • fields

    • 使用 fields 来明确字段, 可以写明具体哪些字段
    • 也可以写 __all__,所有字段都生成序列化规则
  • exclude:可以明确排除掉哪些字段

  • read_only_fields:指明只读字段,即仅用于序列化输出的字段

  • extra_kwargs:为 ModelSerializer 添加或修改原有的选项参数,来定制某些字段(嵌套字典)

from rest_framework import serializers
from App.models import Projectsclass ProjectModelSerializer(serializers.ModelSerializer):email = serializers.EmailField(write_only=True)class Meta:# 需要在Meta内部类这两个指定model类属性:需要按照哪一个模型类来创建# fields类属性来指定模型类中哪些字段需要输入或输出model = Projectsfields = '__all__'exclude = ('id', 'desc', 'create_time')extra_kwargs = {'programmer': {'label': '研发人员','write_only': True,}}

DRF框架之serializer序列化相关推荐

  1. Django框架之DRF框架

    文章目录 一.前言 1.Web应用模式 2.RESTful API规范 二.简介 三.安装与配置 四.序列化器 1.创建序列化器 2.序列化操作 1)序列化过程 2)反序列化过程 3.校验规则 1)单 ...

  2. DRF框架知识点总结

    web开发的两种模式:前后端不分离和前后端分离 RestFul API接口设计风格:前后端分离被广泛采用 使用Django基础自定义Rest API接口 DRF框架: 提高开发Rest API接口的效 ...

  3. DRF框架—序列化器中的字段校验规则

    一.怎么校验创建的项目名是否是唯一的,当项目名name字段不唯一,怎么设置提示信息? 方法:导入UniqueValidator from rest_framework.validators impor ...

  4. DRF框架及APIView

    1.前后端不分离 缺点 业务耦合较强 指责划分不明确 开发成本较高 服务器压力较大 在服务端渲染页面返回给用户,在高并发情况下会占用大量资源 优点 提高SEO速度,提高搜索引擎收录检索速度 页面数据都 ...

  5. DRF框架APIView

    1.前后端分离 前: 主要以页面的美观和流程,兼容三部分 后:主要以三高 业务耦合 需要懂数据库.懂框架操作.懂模版前端 指责划分不明确 会造成团队之间沟通混乱,代码不统一,前后端技能水平层次不齐的水 ...

  6. python drf_python | DRF 框架知识总览

    DRF 框架 DRF 框架知识总览 接口(api) 什么是接口 定义 前台与后台进行信息交互的媒介 -- url链接 接口组成 url链接 - http://127.0.0.1:9000/api/us ...

  7. DRF框架之十大接口、视图家族

    文章目录 DRF框架之十大接口.视图家族 序列化类外键字段的覆盖 十大接口序列化总结 常见使用 单查接口 群查接口 单增接口 群增接口 单整体改接口 群整体改接口 单局部改接口 群局部改接口 单.群删 ...

  8. 第九单元 DRF框架及APIView

    1.前后端分离和不分离的概念 1.前后端分离: 1.1 前端:浏览器 HTML.CSS.Bootstrap.JS.JQuery.Vue.NodeJS.webpack 炫酷.流畅.兼容 后端:服务端 D ...

  9. Andriod:serializer序列化器生成xml文件

    serializer序列化器生成xml文件 目录 serializer序列化器生成xml文件 一.目录结构 二.类MainActivity 三.类:SMS 四.activity_main.xml 一. ...

最新文章

  1. 只需4步,自己搞个 Spring Boot Starter !
  2. c语言链表缓冲区,求助! 链表和scanf()缓冲区问题
  3. 求职OMG——大学生就业指导与技能
  4. HTML/CSS/JavaScript学习总结(转)
  5. Android带三角形的弹窗,Android实现三角形气泡效果方式汇总
  6. [集训队作业2018] 复读机(生成函数,单位根反演)
  7. html底部弹出选择,jQuery手机端底部弹出菜单列表特效代码
  8. dlut-KFQ人工智能导论答案1
  9. 4个Shell小技巧,帮你提高机器学习生产效率
  10. 每日一九度之题目1021:统计字符
  11. 2018/12/04 PAT刷题 L1-008 求整数段和 java
  12. @Value 注入 map、List,yaml 格式
  13. 苹果电脑 / Mac 开机密码忘记了应该如何操作?
  14. Linux命令:reboot
  15. mac蓝牙连接有问题要怎么处理呢?
  16. android 沉浸式开源库,Android沉浸式状态栏
  17. 对抗海量表格数据,【华为2012实验室】没有选择复仇者联盟
  18. MySQL免安装版下载及安装
  19. python微博_Python自动化发微博
  20. 【other】idea格式化快捷键ctr+alt+L与qq锁定冲突

热门文章

  1. 10分钟23张图,带你了解中国互联网现状
  2. 安装稳定版python 3.9.2
  3. B站里的宝藏UP主你知道多少?
  4. Visual Studio 2019 界面开发开启控制台
  5. unity Mirror使用心得一(玩家角色创建,控制,及其攻击其他玩家的血量同步设置)
  6. Windows Store apps开发[76]企业部署Windows 8 Store 风格应用
  7. usaco 2008 oct pwalk
  8. QT使用sqllite
  9. location 拦截所有_菜鸟专用广告手动拦截手册
  10. 软件建模与分析【二】