142.创建序列化类、序列化测试、反序列化测试

news2024/11/24 16:47:26

1.创建序列化类

在这里插入图片描述

什么是序列化,为什么要序列化?
当前web api应用中,前端要用到从后台返回的数据来渲染页面的时候,一般都是使用的json类型的数据,因为json类型简单直观便于理解,那么就需要在django框架中,将模型类数据序列化为json。

1.1 建立模型

from django.db import models

# Create your models here.
class Student(models.Model):
    SEX_CHOICES = ((1,'男'),(2,'女'))
    name = models.CharField(max_length=20,verbose_name='姓名')
    age = models.IntegerField(null=True, blank=True, verbose_name='年龄')
    sex = models.IntegerField(choices=SEX_CHOICES,default=1,verbose_name='性别')
        

1.2 迁移模型与数据库配置

数据库配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'rest_study',
        'HOST':'127.0.0.1',
        'PORT':'3306',
        'USER':'root',
        'PASSWORD':'root',
    }
}

迁移模型

python manage.py makemigrations
python manage.py migrate

1.3 创建序列化类

在子应用的目录下,新建app_serializers.py 文件,在其中建立一个对应第一步建立的模型的序列化类:

from rest_framework import serializers
from rest_app.models import *
class StudentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Student
        fields = ['id', 'name', 'age', 'sex'] #或者 ='__all__'
        

说明:

  • 继承自serializers.ModelSerializer类
  • 必须实现class Meta
  • model 的值为对应的模型类
  • fields 的值是要序列化的字段,设置为 fields = ‘all’ 则使用所有模型的字段,也可以使用 exclude 指明要排除的字段,例如:exclude = [‘id’] , 通常使用 fields
  • 继承自ModelSerializer类,其实是一种快捷的方式,也可以直接继承serializers.Serializer,手动写字段集以及 create、update方法。ModelSerializer有一个 repr 属性来查看字段集是如何编写的:

1.4 测试执行模型的方法

打开django脚本控制台

python manage.py shell

在这里插入图片描述

2.序列化测试

2.1 序列化一个模型实例

>>> from rest_app.models import *  # 导入模型
>>> stu = Student.objects.get(pk=1)  # 获取id为1的模型实例
>>> stu_ser = StudentSerializer(stu) # 序列化数据
>>> data_dict = stu_ser.data # 获取数据
>>> from rest_framework.renderers import JSONRenderer
>>> data_join = JSONRenderer().render(data_dict)  # 将字典数据转换为json格式字节串
>>> data_join
b'{"id":1,"name":"\xe5\xb0\x8f\xe7\xba\xa2","age":23,"sex":1}'

2.2 序列化模型的查询集QuerySet——序列化全部模型实例

>>> stus = Student.objects.all()
>>> stus
<QuerySet [<Student: Student object (1)>, <Student: Student object (2)>]>
>>> stu_ser = StudentSerializer(stus,many=True)
>>> stus
<QuerySet [<Student: Student object (1)>, <Student: Student object (2)>]>
>>> data_dict = stu_ser.data
>>> data_dict
[OrderedDict([('id', 1), ('name', '小红'), ('age', 23), ('sex', 1)]), OrderedDict([('id', 2), ('name', '小强'), ('age', 24), ('sex', 1)])]
>>> data_join = JSONRenderer().render(data_dict) 
>>> data_join
b'[{"id":1,"name":"\xe5\xb0\x8f\xe7\xba\xa2","age":23,"sex":1},{"id":2,"name":"\xe5\xb0\x8f\xe5\xbc\xba","age":24,"sex":1}]'

3. 反序列化测试

# 将json格式的字节串转化为字典
>>> from rest_framework.parsers import JSONParser
>>> import io
>>> stream = io.BytesIO(b'{"name":"lili","age":20,"sex":2}') # 准备json格式的字节串
>>> stream
<_io.BytesIO object at 0x000001DD4042AA90>
>>> data_dict = JSONParser().parse(stream)# 转化为字典 
>>> data_dict
{'name': 'lili', 'age': 20, 'sex': 2}

>>> from rest_app.app_serializer import StudentSerializer  
>>> serializer = StudentSerializer(data=data_dict) # 将字典数据反序列化
>>> serializer.is_valid()# 必须执行这一步验证,返回True才可以获取后续的validated_data数据和执行save方法
True
>>> serializer.validated_data # 得到OrderedDict,会忽略到id属性
OrderedDict([('name', 'lili'), ('age', 20), ('sex', 2)])
>>> serializer.save() # 保存到数据库
<Student: Student object (3)>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/53427.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

openEuler 通过 手工方式 安装 ceph 步骤

ceph集群在openEuler手工安装过程openEuler手工安装ceph 安装步骤前置要求1.openEuler版本2. Python 33. Systemd4. Time synchronization (such as chrony or NTP)5. LVM2 for provisioning storage devices安装1. 创建用户ceph2. 安装 ceph3. 生成配置项3.1 机器及组件规划列…

【Confluence】预览中文附件出现乱码,离线Linux下安装字体

what: confluence页面预览含有中文的附件时乱码 why&#xff1a;Linux服务器上 缺少中文字体 how&#xff1a; 一、安装字体 1、拷贝字体&#xff1a;linux上/usr/share/fonts/路径下新建目录msttcore&#xff0c;将windows的C:\Windows\Fonts的字体文件拷贝到/usr/share/fonts…

Mac Typora + PicGo + Github配置图床

Mac Typora PicGo Github配置图床 为了能把自己整理的博客发到CSDN上集集赞又介于一张张贴图很麻烦&#xff0c;所以搞了搞图床试试效果 下载PicGo 会魔法的建议直接爬长城&#xff1a;PicGo 不会魔法的用山大的镜像&#xff1a;PicGo Github图床设置 新建项目 随便起个…

详解:进程程序替换

目录一、前言二、什么是进程程序替换&#xff1f;三、进程程序替换的原理四、为什么要进行进程程序替换&#xff1f;五、如何进行进程程序替换&#xff1f;(常见进程程序替换系统调用接口)六、利用所学综合知识实现一个shell总结一、前言 一般情况下&#xff0c;对应的语言写的…

ELMO语言模型

ELMOELMO提出背景&#xff1a;解决一词多义问题。模型结构&#xff1a;双层双向的LSTM&#xff0c;字符卷积&#xff0c;第一层lstm表示更多的句法特征&#xff0c;第二层lstm表示更多的语义特征从ELMO开始以后学的语言模型都是预训练语言模型。预训练模型&#xff1a;1.预训练…

微机-------输入/输出接口(第六章)

目录 输入/输出接口概述输入/输出接口的功能CPU与输入/输出接口之间的信息⭐⭐输入/输出端口的编址方式统一编址独立编址输入/输出接口概述 CPU与外部设备进行信息交换时的困难: ①CPU和外设的速度差异非常大 ②CPU不能和外设直接通过引脚连接 注意: CPU和外设之间必须要设置…

5G LDPC polar 3GPP 定案过程

前言 看到中科大袁老师一段关于3GPP 组织 在 5G LDPC, polar 编解码定案过程&#xff0c;简单分享一下 一 简介 整个方案上百家公司整整争论了一年,最终定下来 其里碑阶段分3段如下&#xff1a; 二 主要争论点 当初主要有两大纠纷&#xff1a; 1&#xff1a; 数字信道 和控制…

基于thinkphp校园二手交易网站#毕业设计

随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 东方二手交易网站设计管理系统网站主要的功能模块包括首页、个人中心、卖家管理、买家信息管理、商品信息管理、订单信息管理、商品分类管理、系统管理…

基于51单片机电子微波炉控制系统(源程序+仿真+原理图+全套资料)

资料编号&#xff1a;203 功能介绍&#xff1a; 该电子微波炉采用51单片机制作&#xff0c;有基本的加热、冷却、启动、停止等功能&#xff0c;并通过MCU 控制其加热、冷却时间&#xff0c;LED 数码管显示时间。程序采用C语言编写&#xff0c;仿真使用Proteus&#xff0c;程序…

Redis的分布式锁问题(十)最强分布式锁工具:Redisson

Redisson的引入 我们先来看看之前的基于setnx实现的分布式锁存在的问题&#xff1a; 我们之前实现的分布式锁是基于redis的setnx命令的特性的&#xff01; 但是&#xff0c;这样子实现起来会有很多弊端&#xff01; 不可重入 简单的来说就是一旦setnx [key] [value]后&…

这才是图扑数字孪生污水处理厂该有的样子

近年来&#xff0c;智慧水务、数字水务成为水务行业的热点领域。对于污水处理领域&#xff0c;如何贯彻落实双碳战略&#xff0c;积极推进智慧水厂建设&#xff0c;显得尤为关键。 图扑软件依托自主研发的 HT for Web 产品&#xff0c;并结合视频融合、BIM、5G、物联网、云计算…

matplotlib 中子图subplot 绘图时标题重叠解决办法

引言 使用Python的matplotlib库绘制子图发现标题发生了重叠。 原来的代码&#xff1a; plt.rcParams[font.family][SimHei] datayear_genfor i in range(1,11):plt.subplot(5,2,i)typetype_df.index[:][i-1]setplot_TypeTime(i,data,type)plt.show()上网上寻找解决办法。 按照…

Allegro添加渐近线操作指导

Allegro添加渐近线操作指导 Allegro支持添加渐近线,让线宽变化的地方进行圆环的过渡,对于射频信号优化有很大帮助,类似下图 具体操作如下 首先设置参数,route-Gloss-Parameters 点击Fillet and Taper Trace前面的方框 勾选Allowed DRC, Unused Nets 勾选Tapered Trac…

BLUElegend传奇引擎不使用路由器架设单传奇的办法

使用BLUE LEGEND架设传奇私发服单机的朋友&#xff0c;是不是因为找不到路由器而无法架设单机服务端呢&#xff0c;这里介绍一种方法不需要买路由器来架设。 为什么LEG引擎需要路由器才能架设呢&#xff1f; 网上找了很多教程都得不到答案&#xff0c;有些人说是为了固定ip地址…

[附源码]计算机毕业设计SpringBoot网上鲜花购物系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

leetcode-每日一题-1779-找到最近的有相同 X 或 Y 坐标的点(简单,数学思想)

今天这道每日一题很简单&#xff0c;没啥可说的&#xff0c;细心点即可 1779. 找到最近的有相同 X 或 Y 坐标的点 难度简单73收藏分享切换为英文接收动态反馈 给你两个整数 x 和 y &#xff0c;表示你在一个笛卡尔坐标系下的 (x, y) 处。同时&#xff0c;在同一个坐标系下给你一…

基于verdaccio工具搭建npm私服vue组件库

大纲 搭建npm私服的必要性搭建npm私服操作步骤发布私有包的过程 一、搭建npm私服的必要性 下载速度更快便于管理&#xff0c;可以分配权限可以修改第三方包&#xff0c;放入我们得私服可以只在公司局域网中用&#xff0c;不公开 二、搭建npm私服的主要操作 环境准备 确保服…

Google单元测试框架gtest之官方sample笔记4--事件监控之内存泄漏测试

sample 10 使用event listener监控Water类的创建和销毁。在Water类中&#xff0c;有一个静态变量allocated&#xff0c;创建一次值加一&#xff0c;销毁一次值减一。为了实现这个功能&#xff0c;重载了new和delete关键字&#xff0c;然后在new和delete函数中&#xff0c;做all…

Sqoop概述 第1关:Sqoop概述

为了完成本关任务&#xff0c;你需要掌握&#xff1a; 1.Sqoop 概述&#xff1b; 2.Sqoop 基本架构。 Sqoop 概述 设计动机 Sqoop 从工程角度&#xff0c;解决了关系型数据库与 Hadoop 之间的数据传输问题&#xff0c;它构建了两者之间的“桥梁”&#xff0c;使得数据迁移工…

【Linux】ls命令

ls&#xff1a;List Directory Contents&#xff0c;显示目录下内容。 .表示当前目录 …表示上一级目录 .开头文件为隐藏文件 说明&#xff1a; 查看文件大小 ls -asSh ls -al ls -alh fan