序列化

  把Python中对象转换为json格式字符串

反序列化

  把json格式转为为Python对象。

用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串。

序列化两大功能:

  对请求数据进行验证

  对Queryset对象进行序列化

一、Django自带序列化组件

  略

二、rest framework序列化之Serializer

使用方式如下:

建表 models.py

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Book(models.Model):
  6. title=models.CharField(max_length=32)
  7. price=models.IntegerField()
  8. pub_date=models.DateField()
  9. publish=models.ForeignKey("Publish")
  10. authors=models.ManyToManyField("Author")
  11. def __str__(self):
  12. return self.title
  13.  
  14. class Publish(models.Model):
  15. name=models.CharField(max_length=32)
  16. email=models.EmailField()
  17. def __str__(self):
  18. return self.name
  19.  
  20. class Author(models.Model):
  21. name=models.CharField(max_length=32)
  22. age=models.IntegerField()
  23. def __str__(self):
  24. return self.name

views

写一个restframework接口拿到数据(所有图书)

方式一:如果没有序列化组件的话,要先转成字典,然后再用json.dumps()再转。

方式二:用序列化组件。

首先你要序列化谁,先写一个类。这个类继承一个东西,然后用的时候,在视图类中直接用这个类生成一个对象。

  1. from django.shortcuts import render,HttpResponse
  2. from rest_framework.views import APIView
  3. from rest_framework.response import Response
  4.  
  5. # Create your views here.
  6.  
  7. from api import models
  8.  
  9. # 想用这个类,需要导入
  10. from api.MySerializer import BookSerializer
  11.  
  12. class BookView(APIView):
  13.  
  14. def get(self,request,*args,**kwargs):
  15. ret = {
  16. 'code':100,
  17. 'msg':'成功了'
  18. }
  19. books = models.Book.objects.all()
  20. # 第一个参数是要序列化的对象,如果序列化多条,必须指定many=True
  21. books_ser = BookSerializer(instance=books,many=True)
  22. # 当序列化的对象是单个对象的时候many=False book = models.Book.objects.all().first()
  23. # books_ser.data 就是序列化后的结果 是个字典
  24. print(books_ser.data)
  25. ret['books']=books_ser.data
  26. # return Response(books_ser.data)
  27. return Response(ret)

写的格式化的类在另外的文件夹或文件:

  1. # 自己写一个序列化的类
  2. from rest_framework import serializers
  3. class BookSerializer(serializers.Serializer):
  4. # 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写
  5. id = serializers.CharField()
  6. title = serializers.CharField()
  7. price = serializers.CharField()

在线格式化json

https://www.json.cn

获取一本id为3的书  http://127.0.0.1:8000/book/3

路由:

  1. from api import views
  2.  
  3. urlpatterns = [
  4. url(r'^admin/', admin.site.urls),
  5. url(r'^books/$', views.BookView.as_view()),
  6. url(r'^book/(?P<id>\d+)$', views.Book.as_view()),
  7. ]

视图:

  1. from django.shortcuts import render,HttpResponse
  2. from rest_framework.views import APIView
  3. from rest_framework.response import Response
  4.  
  5. # Create your views here.
  6.  
  7. from api import models
  8.  
  9. # 想用这个类,需要导入
  10. from api.MySerializer import BookSerializer
  11.  
  12. class BookView(APIView):
  13.  
  14. def get(self,request,*args,**kwargs):
  15. ret = {
  16. 'code':100,
  17. 'msg':'成功了'
  18. }
  19. books = models.Book.objects.all()
  20. # 第一个参数是要序列化的对象,如果序列化多条,必须指定many=True
  21. books_ser = BookSerializer(instance=books,many=True)
  22. # 当序列化的对象是单个对象的时候many=False book = models.Book.objects.all().first()
  23. # books_ser.data 就是序列化后的结果 是个字典
  24. print(books_ser.data)
  25. ret['books']=books_ser.data
  26. # return Response(books_ser.data)
  27. return Response(ret)
  28.  
  29. class Book(APIView):
  30. def get(self,requst,id):
  31. ret = {
  32. 'code': 100,
  33. 'msg': '成功了'
  34. }
  35.  
  36. book = models.Book.objects.filter(pk=id).first()
  37. book_ser = BookSerializer(instance=book,many=False)
  38. ret['book']=book_ser.data
  39. return Response(book_ser.data)

如果序列化加个publish字段  (外键关联的)

拿到的是  "publish": "Publish object"

如果想显示出版社的名字,拿到出版社的id

可以通过source来改名!

  变量名和source指定的值不能一样。

  source还支持继续点(字段)还支持方法

序列化的类:

  1. # 自己写一个序列化的类
  2. from rest_framework import serializers
  3. class BookSerializer(serializers.Serializer):
  4. # 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写
  5. id = serializers.CharField()
  6.  
  7. # title = serializers.CharField()
  8. name = serializers.CharField(source='title')
  9.  
  10. price = serializers.CharField()
  11.  
  12. publish_name = serializers.CharField(source='publish.name')
  13. publish_id = serializers.CharField(source='publish.pk')

拿出出版社所有的东西:SerializerMethodField()

意思是支持SerializerMethodField()这个方法,并且把返回值赋值给字段

固定写法:get_这个字段名字,里面有个参数obj,这个obj就是当前对象。

  1. # 自己写一个序列化的类
  2. from rest_framework import serializers
  3. class BookSerializer(serializers.Serializer):
  4. # 序列化哪个字段,必须跟数据库字段一样,都想序列化就一个一个排着写
  5.  
  6. publish_dic = serializers.SerializerMethodField()
  7.  
  8. def get_publish_dic(self, obj):
  9. #意思是支持SerializerMethodField()这个方法,并且把返回值赋值给publish_dic
  10. return {'id':obj.publish.pk,'name':obj.publish.name,'email':obj.publish.email}

多对多的表关系:  

drf 之序列化组件的更多相关文章

  1. 第三章、drf框架 - 序列化组件 | Serializer

    目录 第三章.drf框架 - 序列化组件 | Serializer 序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer( ...

  2. DRF的序列化组件

    目录 DRF的序列化组件 Serializer组件 序列化 反序列化 ModelSerializer组件 序列化和反序列化 自定义Response方法 基表相关 DRF中ORM的多表关联操作 外键设计 ...

  3. Django框架(十八)—— drf:序列化组件(serializer)

    序列化组件 # 模型层 from django.db import models class Book(models.Model): nid = models.AutoField(primary_ke ...

  4. drf框架 - 序列化组件 | Serializer

    序列化组件 知识点:Serializer(偏底层).ModelSerializer(重点).ListModelSerializer(辅助群改) 序列化与反序列化 序列化: 将对象序列化成字符串用户传输 ...

  5. Django框架(十九)—— drf:序列化组件(serializer)

    目录 序列化组件 一.利用for循环来实现序列化(繁琐) 二.利用Django提供的序列化组件(不可控需要的字段) 三.利用drf提供的序列化组件 1.基于Serializer类实现序列化--基本语法 ...

  6. DRF(3) - 序列化组件(GET/PUT/DELETE接口设计)、视图优化组件

    一.序列化组件 基于上篇随笔的表结构,通过序列化组件的ModelSerializer设计如下三个接口: GET 127.0.0.1:8000/books/{id} # 获取一条数据,返回值:{} PU ...

  7. drf之序列化组件(一):Serializer

    序列化组件:Serializer.ModelSerializer.ListModelSerializer Serializer  偏底层  ModelSerializer       重点  List ...

  8. drf框架 - 序列化组件 | ModelSerializer (查,增,删,改)

    ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ...

  9. DRF(2) - 解析器,序列化组件使用(GET/POST接口设计)

    一.DRF - 解析器 1.解析器的引出 我们知道,浏览器可以向django服务器发送json格式的数据,此时,django不会帮我们进行解析,只是将发送的原数据保存在request.body中,只有 ...

随机推荐

  1. PHP程序员的能力水平层次

    PHP程序员的能力水平层次 之前看过很多篇关于服务端工程师和PHP开发者的能力模型介绍,每篇都对能力有侧重点. 下面我们来详细谈谈以开发能力为基准点的PHP程序员的能力水平层次. 层层递进 1.功能开 ...

  2. JavaScript中浅拷贝和深拷贝的区别和实现

    深拷贝和浅拷贝的区别   浅拷贝(shallow copy):只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存:    深拷贝(deep copy):复制并创建一个一摸一样的对象,不共 ...

  3. 「JOI 2016 Final」断层

    嘟嘟嘟 今天我们模拟考这题,出的是T3.实在是没想出来,就搞了个20分暴力(还WA了几发). 这题关键在于逆向思维,就是考虑最后的\(n\)的个点刚开始在哪儿,这样就减少了很多需要维护的东西. 这就让 ...

  4. 转://因触发器限制导致oracle用户登录失败

    使用PL/SQL DEV登录数据库时,出现如下错误 手工创建了test用户,通过dev工具登录没问题.怀疑数据库中有些用户限制了登录的.再看错误编号:ORA-20001,oracle保留的异常错误号范 ...

  5. flash设置里面:您的 Flash 设置会一直保留到您退出 Chrome 为止。

    疑问:flash设置里面:您的 Flash 设置会一直保留到您退出 Chrome 为止. 我记得以前的版本配置后就一直用啊,允许的就可以一直允许,现在这个sb版本退出后就恢复到默认,允许列表的网站就清 ...

  6. 【转】Android hdpi ldpi mdpi xhdpi xxhdpi适配详解

    1.了解几个概念(1)分辨率.分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800.720×1280.1080×1920等.720×1280表示此屏幕在宽 ...

  7. 【vue】vue中实现导出excel

    1.安装依赖 cnpm install -S file-saver xlsx cnpm install -D script-loader 2.例如在src文件夹中新建一个名为vendor(vendor ...

  8. 吴恩达课后作业学习2-week2-优化算法

    参考:https://blog.csdn.net/u013733326/article/details/79907419 希望大家直接到上面的网址去查看代码,下面是本人的笔记 我们需要做以下几件事:  ...

  9. Ubuntu 14.04 安装 CUDA 问题及解决

    本文安装环境: - 双显卡: intel 集显 + nvidia 独显 - Ubuntu 14.04.4 - CUDA 8.0.44 1. Deb 安装包是个坑 (不要用这种方法!) 使用 Deb 安 ...

  10. Windows解压安装mysql 5.7.24,并部署多个mysql服务

    mysql官网windows安装文档 https://dev.mysql.com/doc/refman/5.7/en/windows-installation.html 第一步,选择安装包   htt ...