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. 【设计模式】—— 职责链模式ChainOfResponsibility

    前言:[模式总览]——————————by xingoo 模式意图 避免请求的发送者,和接受者过度的耦合在一起.一个请求者只需要发送一个请求即可,它的请求具体由后面哪个对象进行响应,并不需要关心.而请 ...

  2. Day25-JSONP跨域请求

    1.  json 是一种数据格式, jsonp 是一种数据调用的方式.你可以简单的理解为 带callback的json就是jsonp. 2. Python里面有个模块requests, request ...

  3. 洛谷SP16549 QTREE6 - Query on a tree VI(LCT)

    洛谷题目传送门 思路分析 题意就是要维护同色连通块大小.要用LCT维护子树大小就不说了,可以看看蒟蒻的LCT总结. 至于连通块如何维护,首先肯定可以想到一个很naive的做法:直接维护同色连通块,每次 ...

  4. Elastic-Job-Lite 源码分析 —— 运维平台

    本文基于 Elastic-Job V2.1.5 版本分享 1. 概述 2. Maven模块 elastic-job-common-restful 3. Maven模块 elastic-job-cons ...

  5. 自学Zabbix3.10.1.5-事件通知Notifications upon events-媒介类型Script

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix3.10.1.5-事件通知Notifications upon events-媒介 ...

  6. 洛谷 P2303 [SDOi2012]Longge的问题 解题报告

    P2303 [SDOi2012]Longge的问题 题目背景 SDOi2012 题目描述 Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数\(N\),你需要 ...

  7. 51nod1134——(最长上升子序列)

    给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10.   Input 第1行:1个 ...

  8. POJ 1847 Tram (最短路径)

    POJ 1847 Tram (最短路径) Description Tram network in Zagreb consists of a number of intersections and ra ...

  9. POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环)

    POJ 1860 Currency Exchange / ZOJ 1544 Currency Exchange (最短路径相关,spfa求环) Description Several currency ...

  10. .net 未被引用的错误

    开发的时候遇到了一个错误,如下: 错误 1 类型“System.ServiceModel.ClientBase`1<T0>”在未被引用的程序集中定义. 我原本以为是版本号的问题,添加了引用 ...