关于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 ...
随机推荐
- python的Template使用指南
本文主要讲解了python中Template使用方法以及使用技巧,非常实用,有需要的朋友可以参考下: Template无疑是一个好东西,可以将字符串的格式固定下来,重复利用.同时Template也可以 ...
- 用WEKA进行数据挖掘
学习于IBM教学文档 数据挖掘学习与weka使用 第二部 分分类和集群 分类 vs. 群集 vs. 最近邻 在我深入探讨每种方法的细节并通过 WEKA 使用它们之前,我想我们应该先理解每个模型 - 每 ...
- (三)python函数式编程
一.高阶函数 高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 结论:函数本身也可以赋值给变量,即:变量可以指向函数 ...
- 一个iOS开发者的修真之路
在微信上有童鞋问我iOS开发者的入门标准是神马?这个问题难到我了,而且贸然给一个答案出来的话,必定会有万千高手来喷. 凡人修仙,仙人修道,道人修真.当我们还是一个在青石板上蹲马步汗水涔涔的废柴时,或许 ...
- 从java toBinaryString() 看计算机数值存储方式(原码、反码、补码)
一.toBinaryString 方法及其含义 1.1 方法说明 该方法位于java.lang.Integer类中 方法签名:public static String toBinaryString(i ...
- hihocoder offer收割编程练习赛10 C 区间价值
思路: 令v[l, r](0<= l <= r < n)表示区间[l,r]的价值,则长度为n的区间的价值最少为0,最多为n*(n-1)/2.整体对价值二分,求能满足sum{v[l, ...
- Node.js搭建静态服务器
let http = require('http'); let url = require('url'); let fs = require('fs'); let path = require('pa ...
- 公众号如何获取已关注用户的unionid的问题
避免误导,先加一句:首先,得公众号绑定开放平台 这个问题困扰了我一早上,我尝试了很多次获取unionid都失败. 微信的开发文档上有说: 关于特殊场景下的静默授权 1.上面已经提到,对于以snsapi ...
- [备忘]Notification的实用
Intent resultIntent = null; if (!TextUtils.isEmpty(tid)){ resultIntent = new Intent("com.shijie ...
- 架构(Architecture)随想
架构(Architecture)的意义: 先不要看什么是架构,先看下architect是什么,没有错,它是建筑师,在一块空地上build高楼大厦的人,它是一个designer,设计好整个大楼,也是一个 ...