一:django自带序列化组件

  1. Django内置的serializers(把对象序列化成json字符串)
  2. from django.core import serializers
  3. def test(request):
  4. book_list = models.Book.objects.all()
  5. ret = serializers.serialize('json', book_list)
  6. return HttpResponse(ret)

二: rest-framework序列化之Serializer

Serializer各种方法即单表查询

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Book(models.Model):
  6. nid = models.AutoField(primary_key=True)
  7. name = models.CharField(max_length=32)
  8. price = models.DecimalField(max_digits=5, decimal_places=2)
  9. publish_date = models.DateField()
  10.  
  11. publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE)
  12. authors=models.ManyToManyField(to='Author')
  13. def __str__(self):
  14. return self.name
  15.  
  16. class Author(models.Model):
  17. nid = models.AutoField(primary_key=True)
  18. name = models.CharField(max_length=32)
  19. age = models.IntegerField()
  20. author_detail = models.OneToOneField(to='AuthorDatail',to_field='nid',unique=True,on_delete=models.CASCADE)
  21.  
  22. class AuthorDatail(models.Model):
  23. nid = models.AutoField(primary_key=True)
  24. telephone = models.BigIntegerField()
  25. birthday = models.DateField()
  26. addr = models.CharField(max_length=64)
  27.  
  28. class Publish(models.Model):
  29. nid = models.AutoField(primary_key=True)
  30. name = models.CharField(max_length=32)
  31. city = models.CharField(max_length=32)
  32. email = models.EmailField()
  33. def __str__(self):
  34. return self.name
  35. def test(self):
  36. return self.email

models.py

在app01中创建一个新的py文件,mySer.py

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from rest_framework import serializers
  4.  
  5. class BookSerializer(serializers.Serializer):
  6. # 重命名
  7. thisname = serializers.CharField(source='name')
  8. price = serializers.CharField()
  9. # 在source不光能指定字段的名字,还能指定函数的名字
  10. test = serializers.CharField(source='publish.test')
  11.  
  12. # 在source后这样写,能拿到表中的任意字段
  13. # publish = serializers.CharField(source='publish.city')
  14. # source加.内容,判断点后面的是一个字段还是一个可执行的函数,
  15. # 是函数就加括号执行,是字段,取出对应的值给publish
  16.  
  17. # SerializerMethodField可以制定一个方法
  18. publish = serializers.SerializerMethodField()
  19. #方法名:叫get_字段名,要传参数,参数是:当前book对象
  20. def get_publish(self, obj):
  21. dic = {'name': obj.publish.name,'email':obj.publish.email}
  22. return dic

mySer.py

详解如下

来到视图对象

  1. from django.shortcuts import render, HttpResponse
  2. from rest_framework.views import APIView
  3. from app01 import models
  4. from app01.mySer import BookSerializer
  5. from django.http import JsonResponse
  6.  
  7. # Create your views here.
  8.  
  9. # Django内置的serializers(把对象序列化成json字符串)
  10. # from django.core import serializers
  11. # def test(request):
  12. # book_list = models.Book.objects.all()
  13. # ret = serializers.serialize('json', book_list)
  14. # return HttpResponse(ret)
  15.  
  16. class Books(APIView):
  17. def get(self, request, *args, **kwargs):
  18. ret = models.Book.objects.all() # queryset对象
  19. # 生成一个序列化对象,传参数
  20. # 序列化多条,记住many=True
  21. book_ser = BookSerializer(ret, many=True)
  22.  
  23. return JsonResponse(book_ser.data, safe=False)

views.py

总结以上内容

  1. -1 重命名:用source:xx = serializers.CharField(source='name')
  2. -2 取出出版社名字:
  3. 方式一:
  4. -在模型表中重写__str__方法
  5. -publish=serializers.CharField()
  6. 方式二:
  7. -用source
  8. -拿出出版社的城市
  9. -publish=serializers.CharField(source='publish.city')
  10.  
  11. *****如果不指定source,字段必须对应起来,如果指定了source,字段可以任意命名
  12. -source 可以指定字段,也可也指定方法
  13. publish.test这是个方法,会执行该方法,并拿到返回结果
  14. test = serializers.CharField(source='publish.test')
  15. -3 SerializerMethodField,可以指定一个方法
  16. publish=serializers.SerializerMethodField()
  17. # 方法名:叫get_字段名,要传参数,参数是:当前book对象
  18. def get_publish(self,obj):
  19. # obj 是当前book对象
  20. dic={'name':obj.publish.name,'email':obj.publish.email}
  21. return dic
  22. -方法内部可以继续用其他的序列化类
  23. -ModelSerializer
  24. -必须在类中写
  25. class Meta:
  26. model=指定表
  27. # fields = '__all__'
  28. # 指定只取这两个字段
  29. fields = ['nid','name']
  30. # 去掉指定的字段
  31. # exclude=['publish','authors']
  32. # fields,跟exclude不能连用
  33. # 指定深度,就是跨几个表(官方建议小于10,我给你的建议小于3)
  34. # depth = 2

Serializer小总结

Serializer序列化的跨表查询

在postman中的运行效果

效果不好的话将代码复制到www.json.cn中,可以折叠,看起来更清晰,即

如果不想写for循环,还有一种方法

在mySer中写上

  1. # 作者的序列化的类
  2. class AuthorSerializer(serializers.Serializer):
  3. nid = serializers.CharField()
  4. name = serializers.CharField()
  5. age = serializers.CharField()

在图书序列化的类下面 写方法

  1. # 通过上面的作者的序列化的类来实现
  2. def get_authors(self, obj):
  3. auths = obj.authors.all()
         
         #可以继续用序列化来处理
  4. auth_ser=AuthorSerializer(auths,many=True)
  5. return auth_ser.data

这样,在视图函数中一样能拿到图书的作者们

三:serializers.ModelSerializer序列化方法

第一种方式(类中类)

在mySer.py中

  1. from app01.models import Book
  2. class BookSerializer(serializers.ModelSerializer):
  3. # 不用按字段,直接序列化到表模型
  4. #必须写一个内部内,名字必须交Meta
  5. class Meta:
  6. model=Book
  7. fields='__all__' #闹出book表的所有字段

postman运行结果会出现这样,publish和authors都是id

那么在

  1. #重写属性
  2. publish=serializers.CharField(source='publish.name')

在mySer中写

  1. authors=serializers.SerializerMethodField()
  2. def get_authors(self,book):
  3. auths=book.authors.all()
  4. auth_ser=AuthorSerializer(auths,many=True)
  5. return auths.data

第二种方式:depth=? 深度(跨表查询,可控性查,效率低)

  1. ModelSerializer
  2. -必须在类中写
  3. class Meta:
  4. model=指定表
  5. # fields = '__all__'
  6. # 指定只取这两个字段
  7. fields = ['nid','name']
  8. # 去掉指定的字段
  9. # exclude=['publish','authors']
  10. # fields,跟exclude不能连用
  11. # 指定深度,就是跨几个表(官方建议小于10,我给你的建议小于3)
  12. # depth = 2

rest-framework之序列化组件的更多相关文章

  1. restful framework之序列化组件

    一.Django自带序列化组件 from django.core import serializers def test(request): book_list = Book.objects.all( ...

  2. Rest Framework:序列化组件

    Django内置的serializers(把对象序列化成json字符串 from django.core import serializers def test(request): book_list ...

  3. [Django REST framework - 序列化组件、source、钩子函数]

    [Django REST framework - 序列化组件.source.钩子函数] 序列化器-Serializer 什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有f ...

  4. Restful framework【第三篇】序列化组件

    基本使用 -序列化 -对象,转成json格式 用drf的序列化组件 -定义一个类继承class BookSerializer(serializers.Serializer): -写字段,如果不指定so ...

  5. 基于Django的Rest Framework框架的序列化组件

    本文目录 一 Django自带序列化组件 二 rest-framework序列化之Serializer 三 rest-framework序列化之ModelSerializer 四 生成hypermed ...

  6. django rest framework 序列化组件总结

    序列化组件总结 一. 序列化组件本质上为了实现前后端分离,而进行json序列化的一个组件形式,极大方便了解析数据的作用 二. 所有序列化是基于APIView 解析器实现的,通过内部的多继承关系方便实现 ...

  7. cvb源码分析,resful规范,drf,drf序列化组件,95

    1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...

  8. drf 之序列化组件

    序列化 把Python中对象转换为json格式字符串 反序列化 把json格式转为为Python对象. 用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串. 序列化两大功能 ...

  9. Django Rest framework 之 序列化

    RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...

  10. rest-framework框架——APIView和序列化组件

    一.快速实例 Quickstart http://www.cnblogs.com/yuanchenqi/articles/8719520.html restful协议 ---- 一切皆是资源,操作只是 ...

随机推荐

  1. font-face自定义字体使用方法

    今天闲的蛋疼小七来聊一聊关于css3的font-face属性的使用方法: 首先应该好多人没用过这个属性,那只能说你们的设计师还是有人性的, 一旦电脑系统没有的特殊字体或者你设计师故意装13为难你就需要 ...

  2. DHCP(一)

    DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP ...

  3. RAC 11gR2模拟OCR和Votedisk损坏恢复过程

    1)破坏前的ocr和votedisk信息检查 检查ocr自动备份 [root@rac1 ~]# ocrconfig -showbackup rac2 2013/10/13 09:45:30 /u01/ ...

  4. juc线程池原理(五):拒绝策略示例

    概要 拒绝策略介绍 线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施.当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭.第二,任务数量超过线程池的最大限制. 线程池 ...

  5. codeforce 985C Liebig's Barrels(贪心+思维)

    Liebig's Barrels time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  6. Java-Maven-Runoob:Maven NetBeans

    ylbtech-Java-Maven-Runoob:Maven NetBeans 1.返回顶部 1. Maven NetBeans NetBeans 6.7 及更新的版本已经内置了 Maven.对于以 ...

  7. PHP生成唯一固定长度邀请码

    function create_invite_code() { $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $rand = $code[rand(0,25)] .str ...

  8. JS比较实用的时间控件

    使用方法: 下载下来压缩包,文件的地方不要改变,就可以了 http://www.my97.net/dp/down.asp html的代码: <input readonly="reado ...

  9. C#一个判断子串在父串中出现的次数

    /// <summary> /// 计算字符串中子串出现的次数 /// </summary> /// <param name=”str”>字符串</param ...

  10. js中的class

    js中的class 类写法 class SuperClass { constructor(option) { this.a = option; } fn() { console.log(this.b) ...