DRF是分两阶段进行的。

如果是API接收数据,则是先进行Parser,将外界接收的bytes数据分析成python数据类型,其间涉及encoding操作,再进行序列化,将python数据类型保存进数据库。

如果是从API获取数据,则是先进行反序列化,将数据库中的数据转成python数据类型,再进行renderer,将python数据类型渲染成可用于网络传输的byte类型。

实践的代码如下:

models.py

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Toy(models.Model):
  6. created = models.DateTimeField(auto_now_add=True)
  7. name = models.CharField(max_length=150, blank=False, default='')
  8. description = models.CharField(max_length=250, blank=True, default='')
  9. toy_category = models.CharField(max_length=200, blank=False, default='')
  10. release_date = models.DateTimeField()
  11. was_included_in_home = models.BooleanField(default=False)
  12.  
  13. class Meta:
  14. ordering = ('name', )

serializers.py

  1. from rest_framework import serializers
  2. from toys.models import Toy
  3.  
  4. class ToySerializer(serializers.Serializer):
  5. pk = serializers.ImageField(read_only=True)
  6. name = serializers.CharField(max_length=150)
  7. description = serializers.CharField(max_length=250)
  8. toy_category = serializers.CharField(max_length=200)
  9. release_date = serializers.DateTimeField()
  10. was_included_in_home = serializers.BooleanField(required=False)
  11.  
  12. def create(self, validated_data):
  13. return Toy.objects.create(**validated_data)
  14.  
  15. def update(self, instance, validated_data):
  16. instance.name = validated_data('name', instance.name)
  17. instance.description = validated_data('description', instance.description)
  18. instance.toy_category = validated_data('toy_category', instance.toy_category)
  19. instance.release_date = validated_data('release_date', instance.release_date)
  20. instance.was_included_in_home = validated_data('was_included_in_home', instance.was_included_in_home)
  21. instance.save()
  22. return instance

python manage.py shell实践。

  1. from datetime import datetime
  2. from django.utils import timezone
  3. from django.utils.six import BytesIO
  4. from rest_framework.renderers import JSONRenderer
  5. from rest_framework.parsers import JSONParser
  6. from toys.models import Toy
  7. from toys.serializers import ToySerializer
  8.  
  9. toy_release_date = timezone.make_aware(datetime.now(), timezone.get_current_timezone())
  10. toy1 = Toy(name='Snoopy talking action figure', description='Snoopy speaks five languages', release_date=toy_release_date, toy_category='Action figures', was_included_in_home=False)
  11. toy1.save()
  12. toy2 = Toy(name='Hawaiian Barbie', description='Barbie loves Hawaii', release_date=toy_release_date, toy_category='Dolls', was_included_in_home=True)
  13. toy2.save()
  14.  
  15. serializer_for_toy1 = ToySerializer(toy1)
  16. print(serializer_for_toy1.data)
  17.  
  18. serializer_for_toy2 = ToySerializer(toy2)
  19. print(serializer_for_toy2.data)
  20.  
  21. json_renderer = JSONRenderer()
  22. toy1_rendered_into_json = json_renderer.render(serializer_for_toy1.data)
  23. toy2_rendered_into_json = json_renderer.render(serializer_for_toy2.data)
  24. print(toy1_rendered_into_json)
  25. print(toy2_rendered_into_json)
  26.  
  27. json_string_for_new_toy = '{"name":"Clash Royale play set","description":"6 figures from Clash Royale", "release_date":"2017-10-09T12:10:00.776594Z","toy_category":"Playset","was_included_in_home":false}'
  28. json_bytes_for_new_toy = bytes(json_string_for_new_toy, encoding="UTF-8")
  29. stream_for_new_toy = BytesIO(json_bytes_for_new_toy)
  30. parser = JSONParser()
  31. parsed_new_toy = parser.parse(stream_for_new_toy)
  32. print(parsed_new_toy)
  33.  
  34. new_toy_serializer = ToySerializer(data=parsed_new_toy)
  35. if new_toy_serializer.is_valid():
  36. toy3 = new_toy_serializer.save()
  37. print(toy3.name)

DRF分阶段序列化细化实例的更多相关文章

  1. DRF中的序列化器

    DRF中的序列化器详细应用   视图的功能:说白了就是接收前端请求,进行数据处理 (这里的处理包括:如果前端是GET请求,则构造查询集,将结果返回,这个过程为序列化:如果前端是POST请求,假如要对数 ...

  2. iOS 关于自动更新的分阶段发布(灰度发布)的相关简介

    前言:  AppStore 发布应用方式除了自动和手动,如今添加了分阶段发布(灰度发布).目的很明确,降低新版本骤然上升的bug率,不能挽回,只能发布新版本的风险.也也是针对禁止使用热修复,推出的相对 ...

  3. [App Store Connect帮助]七、在 App Store 上发行(4)分阶段发布某个版本更新(iOS 和 watchOS)

    当您发布您 App 的一个版本更新时,您可以选择分阶段发布您的 iOS App.如果您正在提交一个 iOS 版本更新,且您的 App 处于以下 App 状态之一,则此选项可用. 准备提交 正在等待审核 ...

  4. 【DRF框架】序列化组件

    DRF框架的序列化组件 在前后端分离的应用模式中,后端仅返回前端所需的数据,返回的数据类似是JSON,因此需要使用序列化组件进行序列化再将数据返回 使用JsonResponse做序列化 #  使用Js ...

  5. 把一个整体目标设置成多个分阶段目标,完成了一个目标后,就相当于一件事OVER

    如果事情有变坏的可能,不管这种可能性有多小,它总会发生 . 一.任何事都没有表面看起来那么简单:二.所有的事都会比你预计的时间长:三.会出错的事总会出错:四.如果你担心某种情况发生,那么它就一定会发生 ...

  6. C语言预处理编译链接各个阶段错误,分阶段的说一下

    C语言预处理编译链接各个阶段错误,分阶段的说一下 C语言预处理编译链接各个阶段错误,分阶段的说一下比如指针异常,数组下标越界什么的    我来答 1个回答 #热议# 你觉得这辈子有希望看到996消失 ...

  7. 经历了源码的痛苦,掌握DRF的核心序列化器

    目录 DRF的核心--序列化器 序列化器 什么是序列化和反序列化? 序列化 序列化demo 字段类型 字段参数 序列化自定制返回字段 方法一:在序列化类(serializers.py)中写 方法二:在 ...

  8. day71:drf:API接口&Restful API规范&Django Rest Framework&drf中的序列化和反序列化功能

    目录 1.web应用模式 2.API接口 3.Restful API规范 4.序列化 5.Django Rest Framework 1.drf的简单介绍 2.drf的特点 3.如何安装drf 4.d ...

  9. 【Win 10应用开发】分阶段进行数据绑定

    使用x:Bind扩展标记进行数据绑定,是在编译阶段完成,至于说性能优化方面,大概主要是优化CPU资源的使用,因为免去了运行阶段进行绑定的过程.当然,使用这个标记仅仅是绑定上的优化,并不包括数据源.数据 ...

随机推荐

  1. Day24-Ajax操作、图片验证码、KindEditor使用-转

    参考源:http://blog.csdn.net/fgf00/article/details/54917439 三.Ajax操作 ajax操作基于浏览器的xmlHttpRequest对象,IE低版本是 ...

  2. 【uoj34】 多项式乘法

    http://uoj.ac/problem/34 (题目链接) 题意 求两个多项式的乘积 Solution 挂个FFT板子. 细节 FFT因为要满足$n$是$2$的幂,所以注意数组大小. 代码 // ...

  3. java实现超大整数加减乘除四则运算

    原理: 用数组存储数字,按照计算法则进行运算. 代码: package com.hdwang; import java.util.regex.Matcher; import java.util.reg ...

  4. Luogu2661 信息传递(图论)

    Luogu2661 信息传递(图论) Description 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti ...

  5. HDU 6153 扩展kmp

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  6. gulp入门教程(转)

    一.gulp简介     1.gulp是什么? gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器:它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自 ...

  7. Docker:搭建私有仓库(Registry 2.4)

    一.背景 首先,Docker Hub是一个很好的用于管理公共镜像的地方,我们可以在上面找到想要的镜像(Docker Hub的下载量已经达到数亿次):而且我们也可以把自己的镜像推送上去.但是,有的时候, ...

  8. JavaScript中的两种全局对象

    这里总结的东西特别适合先学习c/c++, Java这类标准语言再学JS的童鞋们看,因为JS在程序执行之前就会初始化一个全局对象,这个全局对象到底是什么是跟JS程序运行环境有关的. 根据JavaScri ...

  9. timer.Interval用法简介

    这个东东呢是我在做windows服务的时候碰到的,总结了一下她的用法,如下: 一.指定时间间隔 写一个每隔一分钟就执行一次的吧 public partial class PSJCService : S ...

  10. [转]Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate()

    Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate() 觉得有用的话,欢迎一起讨论相互学习~Follow Me ...