1. #####序列化组件#####
  2.  
  3. 一、什么是序列化
  4. python中一切皆对象,把对象从内存中变成可存储或传输的过程称之为序列化。
  5. 你写一个django项目肯定是有前后端交互的吧,虽然django也可以自己写模板(也就是前端页面),你要给pc端,移动端用?难道要写两个django项目,这样
  6. 是不是太浪费资源了,所以现在出了前后端分离,这样的话,你就写一个后端就好了,不管前端是移动端,还是pc端,我只负责传数据过就好了。出现前后端分离
  7. 的方案,好处还有很多,就不一一多说。
  8. 总之,我django项目只负责返回相应的数据就好了,这就存在数据传输了,我后端从硬盘拿到数据,是在内存中的,所以我需要把内存中的数据,转成一个中间
  9. 格式(它可以进行传输),前端拿到后台传过去的数据后,再进行操作,将这个中间格式的数据,转成前端语言能看懂的数据类型就好了。
  10.  
  11. 二、反序列化和序列化就相反了,把中间格式转成数据类型,能够直接使用。
  12.  
  13. 三、那么就有一个问题了,在python中哪种类型,能在前端语言中使用呢?
  14. 有那么一个,就是字典,它是这样的符号 {} ,在python中就是一个数据类型
  15. 在前端js语言中 {} 这个代表着就是一个对象
  16. 上面这个问题解决了,那么用哪种中间格式去进行传输呢?这个中间格式必须满足pythonjs都可以进行序列化,反序列化
  17. 这个中间格式就是json,可能有其他的(不太清楚)
  18.  
  19. 有了上面两个问题的解决,那我们只需向前台传输json格式的字典就好了,列表套字典也可以,这才是重点!!!!!!
  20.  
  21. 四、如何在rest_framework中使用序列化呢?(Serializer的使用)
  22. from rest_framework import serializers 它所在的位置
  23. 序列化组件的使用其实和forms组件的操作是差不多的,在app文件中新建一个py文件,拿来单独写序列化类。
  24.  
  25. 那我写一个图书的序列化,目的就是为什么要使用序列化的原因。
  26.  
  27. 在新建的py文件中:
  28. from rest_framework import serializers
  29.  
  30. class BookSerializers(serializers.Serializer):
  31. name = serializers.CharField()
  32. price = serializers.CharField()
  33. author = serializers.CharField()
  34. publish = serializers.CharField()
  35.  
  36. 在视图层(views)文件中:
  37.  
  38. class Book(APIView):
  39. def get(self,request):
  40. books = models.Book.objects.all()
  41. book_ser = BookSerializers(instance=books,many=True)
  42. book_dic = book_ser.data
  43. return JsonResponse(book_dic)
  44.  
  45. 这是很基础的序列化使用,book_ser.data这个的返回值就是一个字典
  46. 写一个序列化类也很简单,写一个普通类,然后继承serializers.Serializer就好了
  47. 下面就写写上面出现过的一些方法
  48. -----------------------------------------------------
  49. 1name = serializers.CharField()
  50. -----------------------------------------------------
  51. 2book_ser = BookSerializers(instance=books,many=True)
  52. -----------------------------------------------------
  53. 3book_ser.data
  54. -----------------------------------------------------
  55.  
  56. 先说name = serializers.CharField()这句,首先我们需要知道serializers是一个模块名(也就是py文件),
  57. 上面这句代码,就相当于面向对象的组合,一个对象的属性的值是另一个对象。CharField是不是很熟悉(forms那块),用法的话,和forms组件有一些是相同
  58. 的,写写CharField里的一个参数,source他可以等于表(表就是models文件里)的字段名,或者方法名,但是这个名字不能跟序列化类对应的属性名一样。
  59. 比如:name = serializers.CharField(source='name') 这样是不对的。
  60. 继续还有这样一种方法 name = serializers.SerializerMethodField(),但是要在该序列化类中写一个方法,方法名一定叫做get_name,它的返回值,
  61. 就是name(这个name是序列化类的属性)所对应的值,方法的名字格式就是 get_序列化类属性的名字。
  62. 也可以更改报错的语句 error_messages,和forms里一样
  63.  
  64. 再说book_ser = BookSerializers(instance=books,many=True)这句,这就是生成一个序列化类的对象,肯定会执行__init__这个方法的,那就一层
  65. 一层找,这个__init__方法在哪里,传什么参数进去,最终我们在BaseSerializer这个类里找到了:
  66. BaseSerializer
  67. def __init__(self, instance=None, data=empty, **kwargs):
  68. self.instance = instance
  69. if data is not empty:
  70. self.initial_data = data
  71. self.partial = kwargs.pop('partial', False)
  72. self._context = kwargs.pop('context', {})
  73. kwargs.pop('many', None)
  74. super(BaseSerializer, self).__init__(**kwargs)
  75. def __new__(cls, *args, **kwargs):
  76. # We override this method in order to automagically create
  77. # `ListSerializer` classes instead when `many=True` is set.
  78. if kwargs.pop('many', False):
  79. return cls.many_init(*args, **kwargs)
  80. return super(BaseSerializer, cls).__new__(cls, *args, **kwargs)
  81. 上面说漏了,执行init方法之前,肯定会走new这个方法,我们看这个new方法,判断many的值是否为True or FalseTrue的话,
  82. 执行类的many_init(*args, **kwargs),False执行其基类的new方法。
  83. 直接将many的作用吧:如果为真,那么book_ser.data就是一个列表里夹着字典,如果为假,那就是一个字典。它是通过判断many的值,再进行序列化的,
  84. 假如你instance=books,这个books是一本书的对象,那么many就应该为false(不用传,默认为false),books是多个对象,那么就必须many为真了。
  85. 如果你是序列化的话,那么instance就应该为你想序列化的对象,data必须为空,也就是不传。
  86. 如果你想反序列化的话,也就是前台发送的数据是一个字典,那么data的值就是前端传来的字典,如果该请求是添加书籍的话,那么instance不用传,如果是
  87. 修改书籍操作,那么instance就是该书籍的对象了,你不传哪本书,它怎么知道修改哪本呢?
  88.  
  89. 最后再讲book_ser.data这行代码,它的返回值就是字典或列表里套字典对吧,这取决于many的值
  90.  
  91. 五、ModelSerializer的使用,作用和Serializer一样。继续拿Book为例子
  92.  
  93. class BookSerializers(serializers.ModelSerializer)
  94. class Meta:
  95. model = models.Book
  96. fields = '__all__'
  97.  
  98. 写完啦,效果和上面写的序列化类一样,在自定义序列化类中写一个类,名字必须为Metamodel指定是哪个表,fields = '__all__',全部字段,
  99. 除了上面这些,exclude=('nid',),表示出来nid,其他所有字段,所以excludefields必须只能有一个。depth深度控制。
  100. 虽然'__all__'已经规定完了所有字段的格式,你可以在下面重写你自己哪个字段想返回怎样的格式,比如:
  101. nid = serializers.CharField() ---->>>意思是你可以再写,将前面的覆盖掉
  102.  
  103. 六、HyperlinkedIdentityField的使用
  104. 作用:自动生成一个超链接(url)
  105.  
  106. class BookSerializers(serializers.ModelSerializer)
  107. class Meta:
  108. model = models.Book
  109. fields = '__all__'
  110.  
  111. publish = serializers.HyperlinkedIdentityField(view_name='zhu',lookup_field='publish_id',lookup_url_kwarg='pk')
  112.  
  113. 视图层:
  114. class Book(APIView):
  115. def get(self,request):
  116. books = models.Book.objects.all()
  117. book_ser = BookSerializers(instance=books,many=True,context={'request':request})
  118. book_dic = book_ser.data
  119. return JsonResponse(book_dic)
  120.  
  121. 路由层:
  122. url(r'books/',Book.as_view()),
  123. url(r'publish/(?P<pk>\d+)/$',Publish.as_view(),name='zhu'),
  124.  
  125. 解释下上面HyperlinkedIdentityField传的参数view_name就是路由的name,通过反向解析可以拿到,lookup_field就是通过表的哪个字段,
  126. lookup_url_kwarg就是url中的关键字参数。大概流程是,通过view_name拿到url,把publish_id的值赋给那个关键字参数。
  127.  
  128. 七、校验字段和保存数据功能
  129. 校验字段和forms组件一样,也有局部钩子,全局钩子,也是is_valid()这个方法进行校验,返回值为布尔类型,校验成功直接调用save方法,
  130. 就会保存在数据库中,注意调用save之前,你要保证字段和你数据库中的字段要对得上才行。校验失败的话,errors这里是错误信息

rest_framework--序列化组件的更多相关文章

  1. django rest_framework 序列化组件详解

    为什么要用序列化组件 当我们做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到 ...

  2. rest_framework序列化组件

    一.Django自带的序列化组件  ==>对象序列化成json格式的字符串 from django.core import serializers from django.core import ...

  3. rest_framework之序列化组件

    什么是rest_framework序列化? 在写前后端不分离的项目时: 我们有form组件帮我们去做数据校验 我们有模板语法,从数据库取出的queryset对象不需要人为去转格式 当我们写前后端分离项 ...

  4. rest_framework序列化,反序列化

    序列化组件 from rest_framework.response import Response1.Response本质也是继承了httpresponse,比httpResponse还强大,传入一 ...

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

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

  6. django rest_framework Serializers 序列化组件

    为什么要用序列化组件 当我们做前后端分离的项目~~我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿 ...

  7. rest_framework之ModelViewSet、路由控制、序列化组件快速搭建项目雏形

    以UserInfo表登陆接口为例 ModelViewSet的用法十分简单,定义一个视图类,指定一个模型表,指定一个序列化类即可帮我们完成增删改查等功能 示例: # 视图层 from app01.MyS ...

  8. DjangoRestFramework学习二之序列化组件、视图组件 serializer modelserializer

      DjangoRestFramework学习二之序列化组件.视图组件   本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ...

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

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

  10. rest_framework登录组件,权限组件

    昨日回顾: -HyperlinkedIdentityField(用来生成url),传三个参数 -实例化序列化类的时候,BookSerializer(ret, many=True, context={' ...

随机推荐

  1. c# 使用队列保存图片

    Invoke(new EventHandler(delegate { Bitmap bitmap2 = (Bitmap)eventArgs.Frame.Clone(); ThreadPool.Queu ...

  2. 【学习笔记】String进阶:StringBuffer类(线程安全)和StringBuilder类

    一.除了使用String类存储字符串之外,还可以使用StringBuffer类存储字符串.而且它是比String类更高效的存储字符串的一种引用数据类型. 优点: 对字符串进行连接操作时,使用Strin ...

  3. javascript: Convert special characters to HTML

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 001Angular2环境准备

    01.安装Node.js 和 npm 安装完成后,在命令行依次使用node -v 和 npm -v可以看到版本号. 02.安装cnpm npm需要连接谷歌服务器,国内不能正常使用,需安装cnpm.命令 ...

  5. 如何取消IntelliJ IDEA打开默认项目配置

    一.前言            在前端中,个人比较喜欢使用IntelliJ IDEA开发工具!IntelliJ IDEA是非常强大的开发集成工具,打开IntelliJ IDEA软件默认会打开最近一次的 ...

  6. yanxin8文章归档

    文章归档 - 2015年四月 (共21篇文章) 26日: 14443协议的CRC_A和CRC_B (0条评论) 25日: 百度钱包-1分钱5元话费 (0条评论) 22日: 驾照考试总结 (0条评论) ...

  7. OSGi Bundle

    OSGi Framework looks like OS, Bundle looks like program, OS can create a process to run program with ...

  8. C# winform 跨线程修改界面

    我们可以使用invoke和bengininvoke invoke同步执行一个委托 begininvoke异步执行一个委托

  9. 大数据的正确用法你get到了吗?

    Azure 镜像市场已于2016年9月21日正式上线,在这个统一的集成平台中,客户可以轻松地浏览.搜索和选择一系列来自第三方的应用和解决方案,并可以将其快速一键部署到 Azure 实例当中. 在移动为 ...

  10. check_mk的性能案例

    http://wiki.lustre.org/Check_MK/Graphite/Graphios_Setup_Guide Dell PowerEdge R515 2x 8-Core AMD Opte ...