1、序列化

1、官方教程

https://q1mi.github.io/Django-REST-framework-documentation/tutorial/1-serialization_zh/

https://www.django-rest-framework.org/tutorial/1-serialization/

2、序列化方式1:serializers.Serializer

# 序列化方式1:serializers.Serializer
# 序列化方式1:serializers.Serializer

class SnippetSerializer1(serializers.Serializer):
"""序列化,正反"""
"""
序列化字段 GET请求
"""
id = serializers.IntegerField(read_only=True)
title = serializers.CharField(required=False, allow_blank=True, max_length=100) code = serializers.CharField(style={'base_template': 'textarea.html'})
# 多文本框的类型,比如XML,HTML,SHELL, python
# 在某些情况下如何显示,比如渲染HTML的时候
# {'base_template': 'textarea.html'}标志等同于在Django Form类中使用widget=widgets.Textarea linenos = serializers.BooleanField(required=True)
language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly') """
反序列化字段 POST,PUT请求
""" def create(self, validated_data):
"""
根据提供的验证过的数据,创建并返回一个新的snippet实例
"""
return Snippet.objects.create(**validated_data) # 保存到数据库 def update(self, instance, validated_data):
"""
根据提供的验证过的数据更新和返回一个已经存在的`Snippet`实例。
"""
instance.title = validated_data.get('title', instance.title) # 如果post该字段则取该字段,否则直接从instance中取
instance.code = validated_data.get('code', instance.code)
instance.linenos = validated_data.get('linenos', instance.linenos)
instance.language = validated_data.get('language', instance.language)
instance.style = validated_data.get('style', instance.style)
instance.save() # 保存到db
return instance

3、view视图

from django.test import TestCase

# Create your tests here.

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser # ## 序列化 GET方法
def test1():
snippet = Snippet(code='foo = "bar"\n')
snippet.save() snippet = Snippet(code='print "hello world"\n') # 获取字段,其他的都default
snippet.save() # 保存到db
serializer = SnippetSerializer(snippet) # 序列化为一个class对象
serializer.data
# {'id': 2, 'title': '', 'code': 'print "hello world"\n', 'linenos': False, 'language': 'python', 'style': 'friendly'}
type(serializer.data) # 现在是什么类型呢? ReturnDict
# <class 'rest_framework.utils.serializer_helpers.ReturnDict'> content = JSONRenderer().render(serializer.data) # 转化为json, Python原生数据类型
# content
# b'{"id":2,"title":"","code":"print \\"hello world\\"\\n","linenos":false,"language":"python","style":"friendly"}'
type(content)
# <class 'bytes'> # ## 反序列化 POST PUT
def test2(content):
from django.utils.six import BytesIO # IO,内存的数据 stream = BytesIO(content) # 获取内存中的数据 # <_io.BytesIO object at 0x00000264CC1FE780>
data = JSONParser().parse(stream) # 解析为data,什么类型? 一个流(stream)解析为Python原生数据类型
type(data) # <class 'dict'> serializer = SnippetSerializer(data=data) # 序列化
serializer.is_valid() # 校验
# True
serializer.validated_data # 校验通过的数据
# OrderedDict([('title', ''), ('code', 'print "hello world"'),('linenos', False), ('language', 'python'), ('style', 'friendly')])
type(serializer.validated_data)
# <class 'collections.OrderedDict'> serializer.save() # 保存到db,什么类型? 将Python原生数据类型恢复成正常的对象实例
# <Snippet: Snippet object (3)>

总结

# ## 总结
'''
POST方法create
反序列化 Python原生数据类型 ---> 模型实例 1、json类型的数据,每个字段必须存在
b'{"id":2,"title":"","code":"print \\"hello world\\"\\n","linenos":false,"language":"python","style":"friendly"}' 2、解析成为dict字典,<class 'dict'> Python原生数据类型
data = JSONParser().parse(stream) 3、序列化,<class 'snippets.serializers.SnippetSerializer'>
serializer = SnippetSerializer(data=data) 4、是否校验通过
serializer.is_valid() 5、校验后的数据, <class 'collections.OrderedDict'>
serializer.validated_data 6、保存到DB,<Snippet: Snippet object (3)> 正常的对象实例
serializer.save() ''' '''
GET list方法总结
序列化 模型实例 ---> Python原生数据类型 1、接收每个字段,snippet = Snippet(code='foo = "bar"\n')
code='foo = "bar"\n', title='', style='friendly',language='python', linenos=False 2、保存到DB <class 'snippets.models.Snippet'>
snippet.save() 3、序列化,对象 模型实例
serializer = SnippetSerializer(snippet) 4、序列化的数据 # <class 'rest_framework.utils.serializer_helpers.ReturnDict'>
serializer.data 5、转换为json数据 <class 'bytes'> Python原生数据类型
content = JSONRenderer().render(serializer.data) '''

4、序列化方式2:推荐,serializers.ModelSerializers

# 序列化方式2:serializers.ModelSerializers  (推荐)
"""
1、快捷方式
2、自动,确定一组字段
3、默认实现简单的create与update方法
# 序列化方式2:serializers.ModelSerializers  (推荐)
"""
1、快捷方式
2、自动,确定一组字段
3、默认实现简单的create与update方法
"""
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ['id', 'title', 'code', 'linenos', 'language', 'style']

查看所有字段

# 通过打印,序列化器类实例的结构(representation),查看它的所有字段。
from snippets.serializers import SnippetSerializer
serializer = SnippetSerializer()
print(serializer)
print(repr(serializer)) # repr 规范string形式
# SnippetSerializer():
# id = IntegerField(label='ID', read_only=True)
# title = CharField(allow_blank=True, max_length=100, required=False)
# code = CharField(style={'base_template': 'textarea.html'})
# linenos = BooleanField(required=False)
# language = ChoiceField(choices=[('Clipper', 'FoxPro'), ('Cucumber', 'Gherkin'), ('RobotFramework', 'RobotFramework'), ('abap', 'ABAP'), ('ada', 'Ada')...
# style = ChoiceField(choices=[('autumn', 'autumn'), ('borland', 'borland'), ('bw', 'bw'), ('colorful', 'colorful')...

5、视图

from django.shortcuts import render

# Create your views here.

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer # 渲染器
from rest_framework.parsers import JSONParser # 解析器 from snippets.models import Snippet
from snippets.serializers import SnippetSerializer class JSONResponse(HttpResponse):
"""
一个把content数据,渲染为json数据的HTTPResponse
An HttpResponse that renders its content into JSON.
"""
def __init__(self, data, **kwargs):
content = JSONRenderer().render(data)
kwargs['content_type'] = 'applications/json'
super(JSONResponse, self).__init__(content, **kwargs)
# def __init__(self, content_type=None, status=None, reason=None, charset=None): # 列出所有现有的snippet或创建一个新的snippet /snippet
@csrf_exempt # 从不具有CSRF令牌的客户端对此视图进行POST
def snippet_list(request):
"""
列出所有的code snippet,或创建1个新的snippet
"""
if request.method == 'GET':
snippet = Snippet.objects.all() # queryset对象实例
serializer = SnippetSerializer(snippet, many=True) # serializer模型实例
return JSONResponse(serializer.data) # 序列化的数据 ReturnDict ---> json elif request.method == 'POST':
data = JSONParser().parse(request) # python原生数据 ---> json
serializer = SnippetSerializer(data=data) # serializer模型实例
if serializer.is_valid(): # data验证
serializer.save() # 保存到db, 正常的对象实例
return JSONResponse(serializer.data, status=201) # 验证通过的data,ReturnDict ---> json
return JSONResponse(serializer.errors, status=400) # 未验证的通过的data, # 一个与单个snippet对象相应的视图 snippet/1
@csrf_exempt
def snippet_detail(request, pk):
"""
获取,更新,删除1个code snippet
"""
try:
snippet = Snippet.objects.get(pk=pk)
except Snippet.DoesNotExist:
return HttpResponse(status=404) if request.method == 'GET':
serializer = SnippetSerializer(snippet)
return JSONResponse(serializer.data) elif request.method == 'POST':
data = JSONParser().parse(request)
serializer = SnippetSerializer(snippet, data=data)
if serializer.is_valid():
serializer.save()
return JSONResponse(serializer.data)
return JSONResponse(serializer.errors, status=400) elif request.method == 'DELETE':
snippet.delete()
return HttpResponse(status=404)

6、效果

  

												

01_Tutorial 1: Serialization 序列化的更多相关文章

  1. JAVA Serialization 序列化

    最近在做Android 项目时用到了WebView,可悲的是,在html上有无数用户的操作,而这些操作被JS返回给了Android的内存中,当深层的Activity开启时,之前的Activity很可能 ...

  2. Android Serialization序列化

    Android Serialization 目的: 为了方便測试传感器数据处理算法,Android程序的採集数据.序列化保存为文件.pc程序再通过反序列化读入对象,在PC上測试算法. Java 序列化 ...

  3. JAVA-基础(六) Java.serialization 序列化

    序 列 化 序列化(serialization)是把一个对象的状态写入一个字节流的过程. Serializable接口 只有一个实现Serializable接口的对象可以被序列化工具存储和恢复.Ser ...

  4. android precelable和Serialization序列化数据传输

    一 序列化原因: 1.永久性保存对象,保存对象的字节序列到本地文件中:2.通过序列化对象在网络中传递对象:3.通过序列化在进程间传递对象. 二 至于选取哪种可参考下面的原则: 1.在使用内存的时候,P ...

  5. <经验杂谈>C#/.Net中xml的Serialization序列化与DeSerializetion反序列化

    1.先讲概念:.Net Framework提供了对应的System.Xml.Seriazliation.XmlSerializer负责把对象序列化到XML,和从XML中反序列化为对象.Serializ ...

  6. django restframework 教程之Serialization(序列化)

    介绍 本教程将会通过创建一个简单的粘贴代码项目,突出显示WebAPI,过程中,会介绍组成REST框架的各种组件,让你全面了解如何配合使用. 环境设置 建议使用virtualenv建立新的虚拟环境,确保 ...

  7. [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化

    [.net 面向对象程序设计进阶] (12) 序列化(Serialization)(四) 快速掌握JSON的序列化和反序列化 本节导读: 介绍JSON的结构,在JS中的使用.重点说明JSON如何在.N ...

  8. 最经常使用的两种C++序列化方案的使用心得(protobuf和boost serialization)

    导读 1. 什么是序列化? 2. 为什么要序列化?优点在哪里? 3. C++对象序列化的四种方法 4. 最经常使用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序猿在编写应用程序的时候往往须 ...

  9. 最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

    导读 1. 什么是序列化? 2. 为什么要序列化?好处在哪里? 3. C++对象序列化的四种方法 4. 最常用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序员在编写应用程序的时候往往需要将 ...

随机推荐

  1. Struts笔记5

    文件下载 1.写action类 package com.gyf.web.action; import java.io.File; import java.io.FileInputStream; imp ...

  2. 通俗理解TCP的三次握手

    三次握手流程的本质,可以这么理解:TCP的三次握手其实是双方各一次握手,各一次确认,只是其中一次握手和确认合并在一起. 当然也可以更通俗的去理解: "喂,你听得到吗?" " ...

  3. 【HC89S003F4开发板】 2调度器

    HC89S003F4开发板调度器调试 一.前言 逛论坛看到有人给HC89做了调度器,调度部分直接操作堆栈的. 下载链接 下载下来调试看看. 二.用户代码 @实现效果 编译后led灯闪烁 #includ ...

  4. Angular 学习笔记 (Custom Accessor + Mat FormField + Custom select)

    custom form control 之前就写过了,这里简单写一下. 创建一个组件实现 ControlValueAccessor 接口 @Component({ providers: [ { pro ...

  5. WebClient 下载文件

    WebClient用法小结(转载)   如果只想从特定的URI请求文件,则使用WebClient,它是最简单的.NET类,它只用一两条命令执行基本操作,.NET FRAMEWORK目前支持以http: ...

  6. C#合并选中EXCEL中的各个工作表

    合并选中EXCEL中的各个工作表,以第一个选中的EXCEL文件里的工作表进行匹配,遍历后面的每个EXCEL文件,有相同的工作表就合并: private void button1_Click(objec ...

  7. shim和polyfill 区别解释

    polyfill 是 shim 的一种.shim 是将不同 api 封装成一种,比如 jQuery 的 $.ajax 封装了 XMLHttpRequest 和 IE 用 ActiveXObject 方 ...

  8. EntityFramework进阶(一)- DbContext与ObjectContext互转

    本系列原创博客代码已在EntityFramework6.0.0测试通过,转载请标明出处 EF中我们常用的是DbContext作为上下文,如果要想获取元数据等信息还是要用到ObjectContext这个 ...

  9. 【Mybatis】缓存

    一.概述 1.1 缓存的意义 1.2 mybatis持久层缓存 二.一级缓存 2.1 原理 2.2 一级缓存配置 一级缓存测试 三.二级缓存 3.1 原理 3.2 mybatis二级缓存配置 3.3 ...

  10. c# 串行化事件