Django:序列化的几种方法

前言

关于序列化操作,就是将一个可迭代的数据结构,通过便利的方式进行我们所需要的操作。

今天历来归纳一下,Django中的几种不同得分方法,已经Django-restframework提供的方法

创建一个Django的项目

再新建一个app

创建一个模型,以书本出版社为例,自行迁移完成以后,再配置路由,主要讲解的是views.py,其他的不多说了。

复制代码
# RESFUL_DJ/app/models.py

from django.db import models# Create your models here. class Publisher(models.Model):name = models.CharField(max_length=32, verbose_name='名称', unique=True)address = models.CharField(max_length=128, verbose_name='地址')def __str__(self):return self.nameclass Meta:db_table = 'db_publisher'verbose_name = "出版商"verbose_name_plural = verbose_name
复制代码

数据库中的内容(使用的是sqlite3)

现在我们来展示数据库中的所有数据,以json的格式传给前端

RESTFUL_DJ/app/views.py

方法一:

复制代码
from django.http import HttpResponsefrom app import modelsdef publisher_list(request):'''通过不同的方法,展示所有的出版社对象:param request: 请求:return: 出版社对象'''queryset = models.Publisher.objects.all()# 方法一data = []# 这个方法的缺点就是:# 如果字段多了的话,就需要一个一个去写,会很麻烦# 返回的是字典类型,所以需要json转换成json格式字符串for i in queryset:p_tmp = {"name": i.name,"address": i.address}data.append(p_tmp)import jsonreturn HttpResponse(json.dumps(data), content_type='application/json')
复制代码

结果:

这是谷歌浏览器安装的插件的原因,方便查看,原结构是这样:

方法二:

复制代码
from django.http import HttpResponsefrom app import modelsdef publisher_list(request):'''通过不同的方法,展示所有的出版社对象:param request: 请求:return: 出版社对象'''queryset = models.Publisher.objects.all()# 方法二data = []# django自带的模型转字典方法# 缺点就是图片之类的文件无法转换# 返回的是字典类型,所以需要json转换成json格式字符串from django.forms.models import model_to_dictfor i in queryset:data.append(model_to_dict(i))import jsonreturn HttpResponse(json.dumps(data), content_type='application/json')
复制代码

 结果:

方法三:

复制代码
from django.http import HttpResponsefrom app import modelsdef publisher_list(request):'''通过不同的方法,展示所有的出版社对象:param request: 请求:return: 出版社对象'''queryset = models.Publisher.objects.all()# 方法三# 导入django自带的序列化器# # 返回的是json字符串,不需要再用json转换一次了from django.core import serializersdata = serializers.serialize('json', queryset)return HttpResponse(data, content_type='application/json')
复制代码

结果:

方法四:

首先需要安装djangorestframework(pip install djangorestframework)

配置好settings.py文件

在app下新建文件serializers.py,(使用跟form差不多)

复制代码
from rest_framework import serializers
from app import modelsclass PublisherSerializer(serializers.Serializer): # 类的命名必须是models中的模型名称加Seriaizerid = serializers.IntegerField(read_only=True)name = serializers.CharField(max_length=32)address = serializers.CharField(max_length=128)def create(self, validated_data):'''重写create方法,创建数据:param validated_data: 用户传递的,经过了校验的数据:return: 创建的数据'''return models.Publisher.objects.create(**validated_data)def update(self, instance, validated_data):'''更新数据操作:param instance: 原来的数据:param validated_data: 用户传递的,经过了校验的数据:return: 更新后的数据'''instance.name = validated_data.get('name', instance.name)instance.address = validated_data.get('address', instance.address)instance.save()return instance
复制代码

 在shell中,测试一下展示操作

测试一下create共功能:

运行项目,结果:

复制代码
from django.shortcuts import render
from django.http import HttpResponsefrom app import modelsdef publisher_list(request):'''通过不同的方法,展示所有的出版社对象:param request: 请求:return: 出版社对象'''queryset = models.Publisher.objects.all()# 方法四# 使用djangorestframework中的序列化from app import serializersserializer = serializers.PublisherSerializer(queryset, many=True) # 多个遍历data = serializer.data # OrderedDict对象import jsonreturn HttpResponse(json.dumps(data), content_type='application/json')
复制代码

 


 

在前面创建的serializers.py文件中定义的序列化字段,其实和models中的模型字段是一样的,我们可以继承过来使用

 

继承serializers.ModelSerializer方法,里面本身就封装好了新建更新等数据操作的方法

更改serializers.py文件的内容:

复制代码
from rest_framework import serializers
from app import modelsclass PublisherSerializer(serializers.ModelSerializer):class Meta:model = models.Publisherfields = ('id','name','address')
复制代码

 结果:

转载于:https://www.cnblogs.com/gcgc/p/11320636.html

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

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

相关文章

让atmega8可以和飞思卡尔xs128一样对IO引脚进行定义

好吧,不得不承认,我使用飞思卡尔的XS128单片机已经非常之习惯了,结果一上手atmega8,最令我反感的就是atmega8不能对IO引脚进行操作,非要用些繁琐的位操作。我就不,我就要像飞思卡尔那样操作。。。 于是。。…

c#通过app.manifest使程序 右键 以管理员身份运行

c#通过app.manifest使程序以管理员身份运行 时间:2013-06-27 22:47来源:网络收集本站整理 作者:jtydl 点击: 1175 次微软在Windows Vista开始引入了UAC(用户帐户控制)新技术(点击这儿了解什么是UAC)。当程序执行时需要权限的话&am…

DataList用法

图片以3列形式显示 <asp:DataList ID"myDataList" runat"server" RepeatColumns"3"> <ItemTemplate> <table width"250px" height"200px" border"0px"> …

java 发送 接受 xml请求

二、客户端代码 通过Http Post Xml传递数据&#xff0c;客户端一般是通过URL建立到服务端的连接&#xff0c;向服务端发送xml数据&#xff0c;然后获取服务端的响应并进行解析&#xff1a; Java代码String xmlString "<?xml version1.0 encodinggb2312?>" …

2019.08.08学习整理

2019.08.08学习整理 文件的高级应用 1.可读、可写 rt: 可读、可写wt: 可写、可读at: 可追加、可读# wt with open(36w.txt, wt, encodingutf-8) as fw:print(fw.readable())print(fw.writable())False True # wt with open(36w.txt, wt, encodingutf-8) as fw:print(fw.readabl…

HTML5新标签

<article>标签定义外部的内容。比如来自一个外部的新闻提供者的一篇新的文章&#xff0c;或者来自 blog 的文本&#xff0c;或者是来自论坛的文本。亦或是来自其他外部源内容。 HTML5:<article></article> HTML4:<div></div><aside>标签定…

WD硬盘 C1门 解决办法

不慎我的硬盘是 西数WDC WD10EARS-003BB1 (931 GB) 每天清早来公司 硬盘吱吱嘎嘎启动甚慢&#xff0c;装Windows2003 系统 软件若干&#xff0c;开机时间据金山卫士 测算为7分钟多&#xff0c;让我无比汗颜&#xff0c;且启动后若干分钟什么也干不了&#xff0c;真正能用的时候…

25款操作系统全面接触 [2]

Sun Solaris Sun Microsystems公司早期的操作系统版本Sun OS是基于BSD的。在1993年&#xff0c;他们与AT&T合作&#xff0c;转向了UNIX System V&#xff0c;并发布了称作Solaris.System V release 4的系统&#xff0c;这是一个UNIX System V和BSD的整合体。Solaris系统主…

Windows 10系统永久关闭Windows Defender Antivirus防病毒程序方法

Win R 键运行 gpedit.msc 找到 计算机配置 -> 管理模板 -> Windows 组件 -> Windows Defender 防病毒程序 右边双击 “关闭Windows Defender防病毒”策略 在打开界面选择 “已启用”选项以禁用Windows Defender Antivirus 如果要重新开通则选择 “未配置”选项 转载于…

Hibernate查询缓存

缓存分类&#xff1a; ◆一级缓存Session级 ◆二级缓存SessionFactory级别 JVM级别 Hibernate查询缓存不固定(根据生命周期 来说 不固定) 生命周期&#xff1a; ◆一级缓存 是和 session 会话一直 产生一直消失 ◆二级缓存 是和 sessionFacotry 一致 Hibernate查询缓存 生命周期…

js数组去重、冒泡排序

数组去重&#xff1a; 方法1、双重for循环---最笨的方法 var arr [1, 2, 3,4 ,5,6, 4, 3, 8, 1]function newArrFn (arr) {// 创建一个新的空数组let newArr []for(let i 0;i<arr.length;i){// 设置一个开关&#xff0c;如果是true&#xff0c;就存进去&#xff0c;不是…

Nuget发布Dll

今天要开始写ViewModel了&#xff0c;写完之后系统里的ViewModel都汇总到我这里&#xff0c;然后由我负责ViewModel的发布跟维护&#xff0c;所以Nuget发布Dll就要熟练啦~ 一&#xff0c;安装工具 1&#xff0c;Nuget Package Manager 2,NuGet.exe 下载地址为&#xff1a;http:…

技巧/诀窍:在ASP.NET中重写URL(转)

技巧/诀窍&#xff1a;在ASP.NET中重写URL 【原文地址】Tip/Trick: Url Rewriting with ASP.NET 【原文发表日期】 Monday, February 26, 2007 9:27 PM 经常有人请我指导应该如何动态地“重写”URL&#xff0c;以在他们的ASP.NETweb应用中发布比较干净的URL端点。这个博客帖…

[导入]竟然支持OpenGL ES!

今天意外的发现&#xff0c;原来S60 3rd原生支持OpenGL ES&#xff0c;这下又给我多了乐趣了~~可是很遗憾&#xff0c;我的E50性能不强劲&#xff0c;还是有独立显卡的N93强悍测试达到442 Frames&#xff0c;而我的E50只有可怜的81 Frames。还好&#xff0c;第三版的性能确实要…

2012 winter training @HIT Day 2 解题报告

今天第二天&#xff0c;主要练习二分和枚举。其实我突然发现&#xff0c;当做题突然卡主的时候&#xff0c;不妨想想今天练习的是什么内容…… 传送门http://acm.hit.edu.cn/hoj/contest/view?id100128 Problem A&#xff1a;Crossed Ladders 此题导致本人郁闷一整天。。从哪说…

如何修改myeclipse中web项目的工作路径或默认路径

如何修改myeclipse中web项目的工作路径或默认路径 博客分类&#xff1a; J2EE开发技术指南安装好myeclipse后&#xff0c;第一次启动myeclipse时&#xff0c;都会弹出会弹出Workspace Launcher对话框&#xff0c;叫你设置myeclipse工作路径。通常我们设置完了后&#xff0c;为了…

FreeRTOS操作系统,在按键中断函数中恢复被挂起的任务,程序卡死的原因和解决办法...

出现问题场景&#xff1a;作为刚接触FreeRTOS实时操作系统的菜鸟&#xff0c;我在练习一个程序功能&#xff1a;按键3按下&#xff0c;将LED闪烁的任务挂起&#xff1b;按键4按下&#xff0c;将LED闪烁的任务恢复到就绪。按键使用外部中断。恢复就绪的语句是xTaskResumeFromISR…

无法连接到远程的SQL SERVER2000

1、先保证ping通 2、在dos下写入telnet ip 1433不会报错 3、用ip连如企业管理器&#xff1a; 企业管理器-->右键SQlserver组-->新建sqlserver注册-->下一步-->写入远程实例名&#xff08;IP,机器名&#xff09;-->下一步-->…

妙趣横生算法 3:寻找相同元素的指针

实例说明 在已知两个从小到大的有序的数表中寻找出现的相同元素在第一个数表中的指针。 运行结果 实例解析 设两个数表的首元素指针分别为pa和pb,两个数表分别有元素an和bn个。另外&#xff0c;引入两个指针变量ca和cb,分别指向两个数表的当前访问元素。由于两个数表从小到大有…

PostgreSQL学习手册(PL/pgSQL过程语言)【转】

原文http://www.cnblogs.com/stephen-liu74/archive/2012/06/06/2312759.html 一、概述&#xff1a; PL/pgSQL函数在第一次被调用时&#xff0c;其函数内的源代码(文本)将被解析为二进制指令树&#xff0c;但是函数内的表达式和SQL命令只有在首次用到它们的时候&#xff0c;…