十七、Django-restframework之序列化器(二)
1. 序列化器
REST framework提供了一个serializer
类,它可以非常方便的序列化模型实例和查询集为JSON
或者其他内容形式。它还提供反序列化,允许在验证传入数据后将解析的数据转换回复杂类型。
2. 定义序列化器
在crm
应用目录下创建serializers.py
文件,编写代码如下:
from rest_framework import serializersfrom crm.models import Studentclass StudentSerializer(serializers.Serializer):"""学生序列化器"""id = serializers.IntegerField(label='学生id', read_only=True)name = serializers.CharField(label='姓名')sex = serializers.IntegerField(label='性别', default=1)age = serializers.IntegerField(label='年龄', required=False, allow_null=True)qq = serializers.CharField(label='qq号码', required=False, allow_null=True)phone = serializers.CharField(label='手机号码', required=False, allow_null=True)channel = serializers.CharField(label='渠道', read_only=True)c_time = serializers.DateTimeField(label='创建时间', read_only=True)def create(self, validated_data):"""创建对象:param validated_data::return:"""return Student.objects.create(**validated_data)def update(self, instance, validated_data):"""更新对象:param instance: :param validated_data: :return: """for key, value in validated_data.items():setattr(instance, key, value)instance.save()return instance
序列化器类的第一部分定义了要序列化/反序列化的字段。create()
和update()
方法定义了在调用serializer.save()
时如何创建或修改实例。
3. 使用序列化器
序列化
进入Django Shell
python manage.py shell
先导入一些需要用到的对象
from crm.models import Student
from crm.serializers import StudentSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParserobj = Student.objects.first()
序列化这个实例
s = StudentSerializer(obj)
s.data
# {'id': 3, 'name': '赵六', 'sex': 1, 'age': 22, 'qq': '1111', 'phone': '18684720553', 'channel': '抖音', 'c_time': '2022-01-14T21:45:06.037745+08:00'}
我们已经将模型实例转换为Python原生数据类型。为了完成序列化过程,我们将数据呈现为json。
JSONRenderer().render(s.data)
# b'{"id":3,"name":"\xe8\xb5\xb5\xe5\x85\xad","sex":1,"age":22,"qq":"1111","phone":"18684720553","channel":"\xe6\x8a\x96\xe9\x9f\xb3","c_time":"2022-01-14T21:45:06.037745+08:00"}'
我们还可以序列化查询集而不是模型实例。为此,我们只需many=True
向序列化程序参数添加一个标志。
ss = StudentSerializer(Student.objects.all(), many=True)
ss.data
# [OrderedDict([('id', 3), ('name', '赵六'), ('sex', 1), ('age', 22), ('qq', '1111'), ('phone', '18684720553'), ('channel', '抖音'), ('c_time', '2022-01-14T21:45:06.037745+08:00')]), OrderedDict([('id', 15), ('name', '心蓝'), ('sex', 1), ('age', 20), ('qq', '111'), ('phone', '1111123'), ('channel', '百度'), ('c_time', '2022-02-08T21:59:54.743096+08:00')]), OrderedDict([('id', 21), ('name', '西瓜'), ('sex', 1), ('age', 20), ('qq', '123456789'), ('phone', '987654321'), ('channel', '抖音'), ('c_time', '2022-02-09T21:15:37.199509+08:00')])]
反序列化
反序列化是相似的,首先将序列化数据(json)解析为原生python数据类型(省略),然后将其填充到一个序列器对象中。
里面要注意的是 当执行serializer.save()的时候,会看有没有instance这个对象 有的话就是更新,没有的话就是创建。
In [1]: from crm.serializers import StudentSerializerIn [2]: from crm.models import *In [3]: data = {'name': '李晨', 'sex':1, 'age':18}In [4]: serializer = StudentSerializer(data=data)In [5]: serializer.is_valid()
Out[5]: TrueIn [6]: serializer.validated_data
Out[6]: OrderedDict([('name', '李晨'), ('sex', 1), ('age', 18)])In [7]: stu = serializer.save()In [8]: stu
Out[8]: <Student: 李晨>
4. 使用模型序列化器
我们的StudentSerializer
类复制了大量Student
模型中的的信息。RESTframework提供了一个ModelSerializer
,它可以根据模型自动创建Serializer
类,让我们的代码更简洁。再次打开crm/serializers.py
模块,并用以下代码替换StudentSerializer
类。
class StudentSerializer(serializers.ModelSerializer):class Meta:model = Studentfields = ['id', 'name', 'sex', 'age', 'phone', 'qq', 'c_time']
序列化器的一个很好的属性是,您可以通过打印序列化器实例的表示形式来检查它的所有字段。进入Django shell
然后尝试如下操作:
In [1]: from crm.serializers import StudentSerializer
In [2]: s = StudentSerializer()
In [3]: print(s)
StudentSerializer():id = IntegerField(label='ID', read_only=True)name = CharField(help_text='姓名', label='姓名', max_length=20)age = IntegerField(allow_null=True, help_text='年龄', label='年龄', max_value=32767, min_value=-32768, required=False)sex = IntegerField(help_text='性别', label='性别', max_value=32767, min_value=-32768, required=False)qq = CharField(allow_blank=True, allow_null=True, help_text='qq号码', label='Qq号码', max_length=20, required=False, validators=[<UniqueValidator(queryset=Student.objects.all())>])phone = CharField(allow_blank=True, allow_null=True, help_text='手机号码', label='手机号码', max_length=20, required=False, validators=[<UniqueValidator(queryset=Student.objects.all())>])c_time = DateTimeField(label='创建时间', read_only=True)channel = PrimaryKeyRelatedField(allow_null=True, help_text='渠道来源', label='渠道', queryset=Channel.objects.all(), required=False)
ModelSerializer类并没有做什么特别神奇的事情,它们只是创建serializer类的一个快捷方式:
- 一组自动确定的字段。
- create()和update()方法的简单默认实现。
5. 使用序列化器编写普通的Django视图
让我们看看如何使用我们新的序列化器类来编写一些API视图。目前我们不会使用任何REST框架的其他特性,我们只会把视图写成普通的Django视图。
编辑crm/views.py
添加如下内容:
def student_list(request):"""学生列表,创建学生视图:param request::return:"""if request.method == 'GET':objs = Student.objects.all()serializer = StudentSerializer(objs, many=True)return JsonResponse(serializer.data, safe=False)elif request.method == 'POST':data = JSONParser().parse(request)serializer = StudentSerializer(data=data)if serializer.is_valid():serializer.save()return JsonResponse(serializer.data, status=201)else:return JsonResponse(serializer.errors, status=400)def student_detail(request, pk):"""检索,更新或者删除一个学生:param request::param pk::return:"""try:obj = Student.objects.get(pk=pk)except Student.DoesNotExist:return HttpResponse(status=404)if request.method == 'GET':serializer = StudentSerializer(obj)return JsonResponse(serializer.data)elif request.method == 'PUT':data = JSONParser().parse(request)serializer = StudentSerializer(obj, data=data)if serializer.is_valid():serializer.save()return JsonResponse(serializer.data)return JsonResponse(serializer.errors, status=400)elif request.method == 'DELETE':obj.delete()return HttpResponse(status=204)
路由配置如下:
urlpatterns = [path('projects/', views.project_list),path('projects/<int:pk>/', views.project_detail)
]
那么通过/projests/
和/projects/id/
就可以访问对应的接口了。
相关文章:
十七、Django-restframework之序列化器(二)
1. 序列化器 REST framework提供了一个serializer类,它可以非常方便的序列化模型实例和查询集为JSON或者其他内容形式。它还提供反序列化,允许在验证传入数据后将解析的数据转换回复杂类型。 2. 定义序列化器 在crm应用目录下创建serializers.py文件&a…...
python GUI图形化编程-----wxpython
一、python gui(图形化)模块介绍: Tkinter :是python最简单的图形化模块,总共只有14种组建 Pyqt :是python最复杂也是使用最广泛的图形化 Wx :是python当中居中的一个图形化,学习结构很清晰 Pywin :是pyth…...
【Python 】yyyy-MM-dd HH:mm:ss 时间格式 时间戳 全面解读超详细
时间格式 时间格式(协议)描述gg时期或纪元。y不包含纪元的年份。不具有前导零。yy不包含纪元的年份。具有前导零。yyyy包含纪元的四位数的年份。M月份数字。一位数的月份没有前导零。MM月份数字。一位数的月份有一个前导零。MMM月份的缩写名称,在AbbreviatedMonthN…...
【C++】C++11 异常
目录 1. C语言传统的处理错误的方式 2. C异常概念 3. 异常的使用 3.1. 异常的抛出和捕获 3.2. 在函数调用链中异常栈展开匹配原则 3.3. 异常的重新抛出 3.4. 异常安全 3.5. 异常规范 4.自定义异常体系 5. C标准库的异常体系 6. 异常的优缺点 6.1. C异常的优点&…...
关于Thread.start()后的困惑、imap
在for循环中,接着开thread,开完就start,当时有个困惑,就是比如开的一个thread的这个start执行完,但是这个for循环还没执行完,那程序会跑到for循环的后面逻辑吗?比如下面13行for循环开始开第一个…...
qml学习之qwidget与qml结合使用并调用信号槽交互
学习qml系列之一说明: 学习qml系列之qwiget和qml信号槽的交互使用,并在qwidget中显示qml界面 在qml中发送信号到qwidget里 在qwidget里发送信号给qml 在qwidget里面调用qml界面方式 方式一:使用QQuickView 这个是Qt5.0中提供的一个类&…...
【 华为OD机试 2023】 组装新的数组(C++ Java JavaScript Python)
文章目录 题目描述输入描述输出描述备注用例题目解析C++JavaScriptJavaPython题目描述 给你一个整数M和数组N,N中的元素为连续整数,要求根据N中的元素组装成新的数组R,组装规则: R中元素总和加起来等于MR中的元素可以从N中重复选取R中的元素最多只能有1个不在N中,且比N中…...
【洛谷 P2089】烤鸡(循环枚举)
烤鸡 题目背景 猪猪 Hanke 得到了一只鸡。 题目描述 猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 101010 种配料(芥末、孜然等)…...
windows10安装ubantu双系统
windows10安装ubantu双系统 文章目录windows10安装ubantu双系统一、安装前准备1.前期说明2.制作U盘启动器3.设置硬盘分区相关4.设置给ubantu系统的硬盘大小,设置为未分配(删除卷)二、进行安装1.设置bios相关2.进入bios启动界面选择U盘安装3.进…...
【华为OD机试 2023】 人数最多的站点/小火车最多人时所在园区站点(C++ Java JavaScript Python)
文章目录 题目描述输入描述输出描述用例题目解析C++JavaScriptJavaPython励志做全网最全、解法最多的华为OD机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。每篇文章都有详细的结题步骤。有问题,随时解答。😁😁😁😁 目前为了造福广大…...
2024届暑期实习实录(阿里云大数据研发平台)
1. 项目介绍(介绍一下你觉得有挑战的项目 (1)项目的痛点需求(配置变更的痛点、你做的目的是什么?) 思考方向:业务背景,用户需求;产品发展,产品现有局限问题…...
空口协议probe req和probe rsp 、auth req和auth rsp 、assoc req和assoc rsp讲解
我们经常可以看到抓到的报文主要有三种:probe req和probe rsp 、auth req和auth rsp 、assoc req和assoc rsp 。 建立联结的三个阶段 相互发现阶段:probe req和probe rsp probe是探测的意思 相互了解阶段:auth req和auth rsp auth是认证的缩写 建立关…...
vscode ssh一直卡在wget的解决方案
vscode ssh一直卡在wget的解决方案找到commit_id 在服务器下点进该目录 .vscode-server\bin 一般日期最新的那一串就是我们需要的commit_id下载vscode-server-linux-x64.tar https://update.code.visualstudio.com/commit:${commit_id}/server-linux-x64/stable 将加粗部分替换…...
【Python学习笔记】第二十五节 Python MySQL
Python 连接到 MySQL 数据库有几种不同的连接方法,而且不是所有的方法都能与不同的操作系统很好地配合.MySQL connector/Python模块是Oracle支持的官方驱动,用于通过Python连接MySQL。该连接器完全是Python语言,而mysqlclient是用C语言编写的…...
折叠屏手机自带的屏幕表面层为什么不能自己撕?
计划入手折叠屏手机的小伙伴看过来,因为折叠屏手机外观的特殊形态,在日常使用中与普通直板手机屏幕的养护还是有着很大的不同,比如直板机入手后新机开箱撕膜这个操作,对于折叠屏手机来说,万万不可!除此之外…...
20.hadoop系列之Yarn资源调度器
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序 1.Yarn基础架构 Yarn主要由ResourceManager、NodeManager、ApplicationMaster和Contai…...
206页16万字城市运行“一网统管”体系建设项目需求报告
本资料来源网络,知识分享,仅供个人学习,请勿商用。完整资料领取见文末,部分资料内容: 第 一 章 应用场景示例 一.1 一卡通人员管理针对企业厂区、办公楼等场所人员出入频繁、安保问题多样化、管理环节复杂等现状&#…...
【JS】数组Array的使用
arr.length 3 通过设置数组长度,实现截取数组,改变原数组 map 循环遍历数组,不改变原数组,返回一个新的数组(可用变量接收) forEach 循环遍历数组,不改变原数组 join 把数组转化为字符串&…...
2023年,软件测试怎么样?
2022年因为各种不可抗力原因,大厂裁员,失业等等频频受到关注。 不解释,确实存在,各行各业都很难,但是,说软件测试行业不吃香,我还真不认同(不是为培训机构说好话,大环境…...
【学习笔记】NOMURA Programming Competition 2020
C - Folia 不难想到自底向上确定树的形态。可能要多尝试一下 一开始想错了好几个地方,服了 假设某一层有XXX个节点,那么上一层可能有⌈X2⌉,⌈X2⌉1,...,X\lceil\frac{X}{2}\rceil,\lceil\frac{X}{2}\rceil1,...,X⌈2X⌉,⌈2X⌉1,...,X个节点&…...
iis下常用程序的伪静态规则列表(包括wordpress、thinkphp)
shopex discuz2.0 discuz2.5 discuz3.x 淘宝客 ecshop phpwind参照http://www.west.cn/faq/list.asp?unid797通过主机面板设置即可 wordpress设置: 第一步: 1.新建一个“chineseurl.php”文件:在里面写入以下代码上传到wordpress安装目录。…...
【Python语言基础】——Python Select From
Python语言基础——Python Select From 文章目录 Python语言基础——Python Select From一、Python Select From一、Python Select From 从表中选取 如需从 MySQL 中的表中进行选择,请使用 “SELECT” 语句: 实例 从表 “customers” 中选取所有记录,并显示结果: import m…...
数据增广真有那么神奇吗?
作者:皮皮雷 来源:投稿 编辑:学姐 论文题目 How Effective is Task-Agnostic Data Augmentation for Pretrained Transformers? 论文作者 S. Longpre, Y. Wang, and C. DuBois 论文发表于 2020 EMNLP findings 摘要 任务无关的数据增广…...
常用基础硬件知识 - 判断MOS管导通
目录1. 概述2. 判断MOS管的导通1. 概述 本文主要记录下基础的硬件知识,方便自己查阅。 2. 判断MOS管的导通 在产品硬件设计中,有时需要程序控制一些电源使能。 1.原理图已经标出了G极(gate)—栅极、S极(source)—源极、D极(drain)—漏极。 如果没有标…...
2023金三银四,测试人还能找到好工作吗?
嫌看文章麻烦的朋友点这里:2023最新软件测试行业变革细谈之我们该如何应对? 按照往年的惯例,春节后复工的 3 月、4 月是人员跳槽最频繁的时候,俗称“金三银四”。然而,市场大环境的影响,很多行业感受到了一…...
c++构造函数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、构造函数1.构造函数的形式2.构造函数的调用时机3.委托构造函数4.复制构造函数二、析构函数本文仅为个人笔记 视频链接:https://www.bilibili.com/vid…...
redis 未授权访问漏洞
redis 未授权访问漏洞 目录 redis 未授权访问漏洞 漏洞描述 漏洞原因: 漏洞危害 漏洞复现: 漏洞复现 写webshell: 写计划任务:centos默认在/var/spool/cron 写ssh公钥实现ssh登录: 漏洞描述: Redis默认情况下…...
如何制作一个自定义的winpe?
winpe制作过程 获取相关资源 https://www.aliyundrive.com/s/MP58JbRsm76 文件存放位置 将压缩包存放在一个全英文目录下了,我这里选择了D:/winpe目录 解压文件 将三个压缩包进行解压到当前目录,如下图所示 创建一个mount目录,并在mount目录下分别创建boot和install目…...
QString转为2进制,8进制,10进制,16进制介绍
首先看段代码: bool ok false;QString ss "11";qDebug()<<"-----"<<ss.toInt(&ok,2)<<ss.toInt(&ok,10)<<ss.toInt(&ok,16)<<ss.toInt(&ok,8);结果: ----- 3 11 17 9 bool ok fal…...
2023-3-2-22:01随笔
好久没怎么更新技术分享博客了。去年从2022年1月3日到2023年1月份一直专注于ADAS的行车横向功能的研发与实车调试,2022年写了几篇项目经验的文章,像LQR算法(虽然和同事(志同道合,技术追求的民哥)写出的工程…...
手机邮箱申请免费注册/seo最强
资料图:正在起飞的客运飞机。 中新网客户端北京1月15日电 (记者 程春雨)“为避免出现热点地区拥堵和票价过高情况,民航局在上海浦东、成都双流、三亚凤凰等10个热点机场开展国内航班延长运行时间试点,增加了航空公司统筹运力安排的灵活性&…...
常用的网络营销推广方法有哪些/百度搜索结果优化
代码版本控制对于我们嵌入式软件开发岗是一项基础、必备的技能,需要熟练掌握。实际工作中常用的版本控制系统有:Git(分布式版本控制系统)与SVN(集中式版本控制系统)。本次分享Git在实际工作中的基本使用方法。一、Git的下载、安装及配置1、Git与Github&a…...
如何提升网站的权重/搜索引擎优化百度
整合自 http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/59848.aspx 根据TI的文档说明,BLE的传输速率可以达到5.9Kb/s。 现在我使用SimpleBLECentral于SimpleBLEPerpheral通讯。 建立了一个具有GATT_PROP_NOTIFY|GATT_PROP…...
显示wordpress用户/百度优化服务
shutdown方法:平滑的关闭ExecutorService,当此方法被调用时,ExecutorService停止接收新的任务并且等待已经提交的任务(包含提交正在执行和提交未执行)执行完成。当所有已提交任务执行完毕,线程池即被关闭。…...
南宁网站推广手段/百色seo外包
环境:VirtualBox6,Ubuntu16.04 虚拟机:controller,compute 首先出现的情况是主机与虚拟机之间不能互相ping通: 上网搜了一些资料,发现我的虚拟机设置成桥接的模式,但是未和主机配置统一网段的ip 参考ht…...
电脑课要求的网站怎么做/百度链接地址
背景 之前使用了chromedp对网页进行了截图操作 这次需要对网页的按钮、输入框进行点击和输入操作 我们对每一次操作进行截图 可以清晰的看到每次的操作结果 备忘 参考: https://github.com/chromedp/chromedp https://pkg.go.dev/github.com/chromedp/chromedp#pkg…...