前言

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

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

创建一个Django的项目

再新建一个app

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

  1. # RESFUL_DJ/app/models.py
  2.  
  3. from django.db import models
  4.  
  5. # Create your models here.
  6. class Publisher(models.Model):
  7. name = models.CharField(max_length=32, verbose_name='名称', unique=True)
  8. address = models.CharField(max_length=128, verbose_name='地址')
  9.  
  10. def __str__(self):
  11. return self.name
  12.  
  13. class Meta:
  14. db_table = 'db_publisher'
  15. verbose_name = "出版商"
  16. verbose_name_plural = verbose_name

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

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

RESTFUL_DJ/app/views.py

方法一:

  1. from django.http import HttpResponse
  2.  
  3. from app import models
  4.  
  5. def publisher_list(request):
  6. '''
  7. 通过不同的方法,展示所有的出版社对象
  8. :param request: 请求
  9. :return: 出版社对象
  10. '''
  11. queryset = models.Publisher.objects.all()
  12.  
  13. # 方法一
  14. data = []
  15. # 这个方法的缺点就是:
  16. # 如果字段多了的话,就需要一个一个去写,会很麻烦
  17. # 返回的是字典类型,所以需要json转换成json格式字符串
  18. for i in queryset:
  19. p_tmp = {
  20. "name": i.name,
  21. "address": i.address
  22. }
  23. data.append(p_tmp)
  24.  
  25. import json
  26. return HttpResponse(json.dumps(data), content_type='application/json')

结果:

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

方法二:

  1. from django.http import HttpResponse
  2.  
  3. from app import models
  4.  
  5. def publisher_list(request):
  6. '''
  7. 通过不同的方法,展示所有的出版社对象
  8. :param request: 请求
  9. :return: 出版社对象
  10. '''
  11. queryset = models.Publisher.objects.all()
  12.  
  13. # 方法二
  14. data = []
  15. # django自带的模型转字典方法
  16. # 缺点就是图片之类的文件无法转换
  17. # 返回的是字典类型,所以需要json转换成json格式字符串
  18. from django.forms.models import model_to_dict
  19. for i in queryset:
  20. data.append(model_to_dict(i))
  21.  
  22. import json
  23. return HttpResponse(json.dumps(data), content_type='application/json')

结果:

方法三:

  1. from django.http import HttpResponse
  2.  
  3. from app import models
  4.  
  5. def publisher_list(request):
  6. '''
  7. 通过不同的方法,展示所有的出版社对象
  8. :param request: 请求
  9. :return: 出版社对象
  10. '''
  11. queryset = models.Publisher.objects.all()
  12.  
  13. # 方法三
  14. # 导入django自带的序列化器
  15. # # 返回的是json字符串,不需要再用json转换一次了
  16. from django.core import serializers
  17. data = serializers.serialize('json', queryset)
  18. return HttpResponse(data, content_type='application/json')

结果:

方法四:

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

配置好settings.py文件

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

  1. from rest_framework import serializers
  2. from app import models
  3.  
  4. class PublisherSerializer(serializers.Serializer): # 类的命名必须是models中的模型名称加Seriaizer
  5. id = serializers.IntegerField(read_only=True)
  6. name = serializers.CharField(max_length=32)
  7. address = serializers.CharField(max_length=128)
  8.  
  9. def create(self, validated_data):
  10. '''
  11. 重写create方法,创建数据
  12. :param validated_data: 用户传递的,经过了校验的数据
  13. :return: 创建的数据
  14. '''
  15. return models.Publisher.objects.create(**validated_data)
  16.  
  17. def update(self, instance, validated_data):
  18. '''
  19. 更新数据操作
  20. :param instance: 原来的数据
  21. :param validated_data: 用户传递的,经过了校验的数据
  22. :return: 更新后的数据
  23. '''
  24. instance.name = validated_data.get('name', instance.name)
  25. instance.address = validated_data.get('address', instance.address)
  26. instance.save()
  27. return instance

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

测试一下create共功能:

运行项目,结果:

  1. from django.shortcuts import render
  2. from django.http import HttpResponse
  3.  
  4. from app import models
  5.  
  6. def publisher_list(request):
  7. '''
  8. 通过不同的方法,展示所有的出版社对象
  9. :param request: 请求
  10. :return: 出版社对象
  11. '''
  12. queryset = models.Publisher.objects.all()
  13.  
  14. # 方法四
  15. # 使用djangorestframework中的序列化
  16. from app import serializers
  17. serializer = serializers.PublisherSerializer(queryset, many=True) # 多个遍历
  18. data = serializer.data # OrderedDict对象
  19. import json
  20. return HttpResponse(json.dumps(data), content_type='application/json')


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

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

更改serializers.py文件的内容:

  1. from rest_framework import serializers
  2. from app import models
  3.  
  4. class PublisherSerializer(serializers.ModelSerializer):
  5. class Meta:
  6. model = models.Publisher
  7. fields = (
  8. 'id',
  9. 'name',
  10. 'address'
  11. )

结果:

还是没有问题,可以使用的。

关于Django中,实现序列化的几种不同方法的更多相关文章

  1. DJango中开启事务的两种方式

    目录 Django中开启事务的两种方式 第一种 第二种 Django中开启事务的两种方式 第一种 from django.db import transaction with transaction. ...

  2. Java中实现序列化的两种方式 Serializable 接口和 Externalizable接口

    对象的序列化就是将对象写入输出流中. 反序列化就是从输入流中将对象读取出来. 用来实现序列化的类都在java.io包中,我们常用的类或接口有: ObjectOutputStream:提供序列化对象并把 ...

  3. django 中实现文件下载的3种方式

    方法一:使用HttpResponse from django.shortcuts import HttpResponse def file_down(request): file=open('/hom ...

  4. Django 缓存、序列化、信号

    一,缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcac ...

  5. Django中的缓存(内存,文件,redis)

    一.Django中的缓存的几种方法 1)单个视图缓存.时间测试 import time from django.views.decorators.cache import cache_page @ca ...

  6. Django框架之序列化和上传文件

     一.Django的序列化(对于ajax请求) Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式. 1)django序列化的使用方法 . ...

  7. django中的FBV和CBV

    django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...

  8. Django学习之序列化和信号

    一.序列化 1.serializers 2.json.dumps 二.信号 1.Django内置信号 2.自定义信号 一.序列化 关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用 ...

  9. django中的FBV和CBV??

    django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...

随机推荐

  1. python的Template使用指南

    本文主要讲解了python中Template使用方法以及使用技巧,非常实用,有需要的朋友可以参考下: Template无疑是一个好东西,可以将字符串的格式固定下来,重复利用.同时Template也可以 ...

  2. 用WEKA进行数据挖掘

    学习于IBM教学文档 数据挖掘学习与weka使用 第二部 分分类和集群 分类 vs. 群集 vs. 最近邻 在我深入探讨每种方法的细节并通过 WEKA 使用它们之前,我想我们应该先理解每个模型 - 每 ...

  3. (三)python函数式编程

    一.高阶函数 高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 结论:函数本身也可以赋值给变量,即:变量可以指向函数 ...

  4. 一个iOS开发者的修真之路

    在微信上有童鞋问我iOS开发者的入门标准是神马?这个问题难到我了,而且贸然给一个答案出来的话,必定会有万千高手来喷. 凡人修仙,仙人修道,道人修真.当我们还是一个在青石板上蹲马步汗水涔涔的废柴时,或许 ...

  5. 从java toBinaryString() 看计算机数值存储方式(原码、反码、补码)

    一.toBinaryString 方法及其含义 1.1 方法说明 该方法位于java.lang.Integer类中 方法签名:public static String toBinaryString(i ...

  6. hihocoder offer收割编程练习赛10 C 区间价值

    思路: 令v[l, r](0<= l <= r < n)表示区间[l,r]的价值,则长度为n的区间的价值最少为0,最多为n*(n-1)/2.整体对价值二分,求能满足sum{v[l, ...

  7. Node.js搭建静态服务器

    let http = require('http'); let url = require('url'); let fs = require('fs'); let path = require('pa ...

  8. 公众号如何获取已关注用户的unionid的问题

    避免误导,先加一句:首先,得公众号绑定开放平台 这个问题困扰了我一早上,我尝试了很多次获取unionid都失败. 微信的开发文档上有说: 关于特殊场景下的静默授权 1.上面已经提到,对于以snsapi ...

  9. [备忘]Notification的实用

    Intent resultIntent = null; if (!TextUtils.isEmpty(tid)){ resultIntent = new Intent("com.shijie ...

  10. 架构(Architecture)随想

    架构(Architecture)的意义: 先不要看什么是架构,先看下architect是什么,没有错,它是建筑师,在一块空地上build高楼大厦的人,它是一个designer,设计好整个大楼,也是一个 ...