关于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.name class Meta:
db_table = 'db_publisher'
verbose_name = "出版商"
verbose_name_plural = verbose_name
数据库中的内容(使用的是sqlite3)

现在我们来展示数据库中的所有数据,以json的格式传给前端
RESTFUL_DJ/app/views.py
方法一:
from django.http import HttpResponse from app import models def 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 json
return HttpResponse(json.dumps(data), content_type='application/json')
结果:

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

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

方法三:
from django.http import HttpResponse from app import models def publisher_list(request):
'''
通过不同的方法,展示所有的出版社对象
:param request: 请求
:return: 出版社对象
'''
queryset = models.Publisher.objects.all() # 方法三
# 导入django自带的序列化器
# # 返回的是json字符串,不需要再用json转换一次了
from django.core import serializers
data = 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 models class PublisherSerializer(serializers.Serializer): # 类的命名必须是models中的模型名称加Seriaizer
id = 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 HttpResponse from app import models def publisher_list(request):
'''
通过不同的方法,展示所有的出版社对象
:param request: 请求
:return: 出版社对象
'''
queryset = models.Publisher.objects.all() # 方法四
# 使用djangorestframework中的序列化
from app import serializers
serializer = serializers.PublisherSerializer(queryset, many=True) # 多个遍历
data = serializer.data # OrderedDict对象
import json
return HttpResponse(json.dumps(data), content_type='application/json')

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


继承serializers.ModelSerializer方法,里面本身就封装好了新建更新等数据操作的方法
更改serializers.py文件的内容:
from rest_framework import serializers
from app import models class PublisherSerializer(serializers.ModelSerializer):
class Meta:
model = models.Publisher
fields = (
'id',
'name',
'address'
)
结果:

还是没有问题,可以使用的。
关于Django中,实现序列化的几种不同方法的更多相关文章
- DJango中开启事务的两种方式
目录 Django中开启事务的两种方式 第一种 第二种 Django中开启事务的两种方式 第一种 from django.db import transaction with transaction. ...
- Java中实现序列化的两种方式 Serializable 接口和 Externalizable接口
对象的序列化就是将对象写入输出流中. 反序列化就是从输入流中将对象读取出来. 用来实现序列化的类都在java.io包中,我们常用的类或接口有: ObjectOutputStream:提供序列化对象并把 ...
- django 中实现文件下载的3种方式
方法一:使用HttpResponse from django.shortcuts import HttpResponse def file_down(request): file=open('/hom ...
- Django 缓存、序列化、信号
一,缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcac ...
- Django中的缓存(内存,文件,redis)
一.Django中的缓存的几种方法 1)单个视图缓存.时间测试 import time from django.views.decorators.cache import cache_page @ca ...
- Django框架之序列化和上传文件
一.Django的序列化(对于ajax请求) Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 1)django序列化的使用方法 . ...
- django中的FBV和CBV
django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...
- Django学习之序列化和信号
一.序列化 1.serializers 2.json.dumps 二.信号 1.Django内置信号 2.自定义信号 一.序列化 关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用 ...
- django中的FBV和CBV??
django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...
随机推荐
- libcurl在centos6.4 64位操作系统上不支持https的解决方案
rpm -e –nodeps 软件名 例如: 使用yum install nginx 安装了nginx, 这是如果直接使用yum remove nginx 的话,会把依赖的一些包也删掉, 所以要使用r ...
- Poj 3294 Life Forms (后缀数组 + 二分 + Hash)
题目链接: Poj 3294 Life Forms 题目描述: 有n个文本串,问在一半以上的文本串出现过的最长连续子串? 解题思路: 可以把文本串用没有出现过的不同字符连起来,然后求新文本串的heig ...
- [USACO 2011 Nov Gold] Above the Median【逆序对】
传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=91 这一题我很快的想出了,把>= x的值改为1,< x的改为- ...
- clock()函数的返回值精度问题
clock()函数返回值为1毫秒,就是0.001秒.clock函数功 能: 返回处理器调用某个进程或函数所花费的时间.用 法: clock_t clock(void);说明:clock_t其实就是lo ...
- 灰度世界算法(Gray World Algorithm) 分类: 图像处理 Matlab 2014-12-07 18:40 874人阅读 评论(0) 收藏
人的视觉系统具有颜色恒常性,能从变化的光照环境和成像条件下获取物体表面颜色的不变特性,但成像设备不具有这样的调节功能, 不同的光照环境会导致采集的图像颜色与真实颜色存在一定程度的偏差,需要选择合适的颜 ...
- Robot Framework and Ride
Robot framework是诺西(NSN)开源的一套自动化测试工具,在通信设备自动化测试中很实用,它基于Python开发,主要模拟NMS网管配置数据到网元NODE,并读取配置看配置是否生效,ECI ...
- linux安装glassfish并布署
1 https://glassfish.java.net/download.html 2 准备工作:需要jdk7以上版本 Java EE 7 requires JDK 7 (or above) 下载g ...
- 一个页面通过iframe,获取另一个页面的form
document.getElementsByTagName("iframe")[0].contentWindow.document.forms[0].submit(); var z ...
- Oracle分区表例子
分区表 Oracle提供的分区方法有以下几种. 1.范围分区(range) 范围分区是应用范围比较广的表分区方式,它是以列的值的范围来作为分区的划分条 件,将记录存放到列值所在的 range分区中. ...
- RabbitMQ五:生产者--队列--多消费者
一.生成者-队列-多消费者(前言) 上篇文章,我们做了一个简单的Demo,一个生产者对应一个消费者,本篇文章就介绍 生产者-队列-多个消费者,下面简单示意图 P 生产者 C 消费者 中间队列 ...