在前一节中,我们已经粗略地介绍了rest_framework的作用之一序列化,下面我们将详细探究序列化的使用。

1.新建一个app snippets

python manage.py startapp snippets

更新配置文件tutorial/settings.py,注册到APPS

INSTALLED_APPS = (
...
'rest_framework',
'snippets.apps.SnippetsConfig',
)

2.创建Model,定义实体

编辑snippets/models.py,添加Snippet模型,该模型用来存储代码片段

from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles()) # Create your models here.
class Snippet(models.Model):
created = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=100, blank=True, default='')
code = models.TextField()
linenos = models.BooleanField(default=False)
language = models.CharField(choices=LANGUAGE_CHOICES, default='python', max_length=100)
style = models.CharField(choices=STYLE_CHOICES, default='friendly', max_length=100) class Meta:
ordering = ('created',)

在数据库中建表

python manage.py makemigrations
python manage.py migrate

3.创建Serializer类,提供序列化,反序列化方法

新建serializers.py,代码如下:

from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES class SnippetSerializer(serializers.Serializer):
pk = serializers.IntegerField(read_only=True)
title = serializers.CharField(required=False, allow_blank=True, max_length=100)
code = serializers.CharField(style={'base_template': 'textarea.html'})
linenos = serializers.BooleanField(required=False)
language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')
created = serializers.DateTimeField(read_only=True)

SnippetSerializer定义了序列化/反序列化的字段,包括字段的类型,范围,不符合的字段值将无法完成序列化/反序列化

Serializer类,有一个save()方法,用来将json格式数据,新增或修改对象。原理如下:

class SnippetSerializer(serializers.Serializer):
pk = serializers.IntegerField(read_only=True)
title = serializers.CharField(required=False, allow_blank=True, max_length=100)
code = serializers.CharField(style={'base_template': 'textarea.html'})
linenos = serializers.BooleanField(required=False)
language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python')
style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly')
created = serializers.DateTimeField(read_only=True) def create(self, validated_data):
return Snippet.objects.create(**validated_data) def update(self, instance, validated_data):
instance.title = validated_data.get('title', instance.title)
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()
return instance

4.Serializer类的使用

新增Snippet对象

from snippets.models import Snippet

snippet = Snippet(code='print "hello, world"\n')
snippet.save()

使用Serializer类序列化Snippet对象

# Create your tests here.
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer snippet = Snippet.objects.first() serializer = SnippetSerializer(snippet)
print(type(serializer.data))
print(serializer.data)

运行结果:

返回json格式数据

使用Serializer类反序列化Snippet对象

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer data = {
'code': 'print "hello, python"\n'
}
serializer = SnippetSerializer(data=data)
if serializer.is_valid():
snippet = serializer.save()
print(snippet)
else:
print(serializer.error_messages)

运行结果:

返回Snippet对象

5.ModelSerializer代替Serializer

Serializer和Model有太多重复的地方,因此有了ModelSerializer,代码示例如下:

from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ("id", "title", "code", "linenos", "language", "style", "created")

运行结果:

ModelSerializer没有使用任何黑科技,实质和Serializer类一样,也是根据Model创建Serializer的过程

6.使用serializer类编写视图

编辑views.py,代码示例如下:

import json

from django.shortcuts import render
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt from snippets.models import Snippet
from snippets.serializers import SnippetSerializer # Create your views here.
@csrf_exempt
def snippet_list(request):
if request.method == 'GET':
snippets = Snippet.objects.all()
serializer = SnippetSerializer(snippets, many=True) #返回字典列表
result_type = type(serializer.data)
result = json.dumps(serializer.data) # 字典转化为json字符串
return HttpResponse(result) if request.method == 'POST':
data = request.body
data = json.loads(data) # json字符串转字典
serializer = SnippetSerializer(data=data)
if serializer.is_valid():
serializer.save()
result = serializer.data
else:
result = {
'status': "failed"
}
result = json.dumps(result) # 字典转化为json字符串
return HttpResponse(result)

csrf_exempt:允许跨域访问

snippet_list: GET--访问Snippet列表

POST--新增Snippet实体

编辑tutorial/urls.py,加入访问snippet地址

from snippets import views

urlpatterns = [
url(r'^snippets/$', views.snippet_list),
url(r'^admin/', admin.site.urls),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

运行结果:

post访问

get访问

django rest_framework入门二-序列化的更多相关文章

  1. django rest_framework入门

    1.rest_framework的作用 1)可以对orm和非orm资源序列化 2)支持restful风格编程(POST,PUT,PATCH) 3)使用类视图编写API的view,而不是函数视图,类视图 ...

  2. django rest_framework入门五-认证和权限

    1.django User实体 django自带了用户验证模块,django/contrib/auth/models.py定义了用户实体,代码如下: class AbstractUser(Abstra ...

  3. django rest_framework入门四-类视图APIView

    上节,我们使用函数视图,用了@api_view装饰器来修饰,这一节,我们介绍类视图APIView,显然,类视图更符合面向对象的原则. 1.使用类视图APIView重写API 类视图APIView,取代 ...

  4. django rest_framework入门三-Requests和Responses

    这一节,我们介绍rest_framework的Requests和Responses对象,来替代django.http的HttpRequest和HttpResponse对象 1.Requests和Res ...

  5. 二、django rest_framework源码之认证流程剖析

    1 绪言 上一篇中讲了django rest_framework总体流程,整个流程中最关键的一步就是执行dispatch方法.在dispatch方法中,在调用了一个initial方法,所有的认证.权限 ...

  6. Python之Django rest_Framework(2)

    实例化: v1 = ["view.xxx.path.Role","view.xxx.path.Group",] 可以循环,循环出来的每一个不能实例化 如果把v1 ...

  7. Django Rest framework 之 序列化

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

  8. python之Django rest_framework总结

    一.rest api    a.api就是接口         如: - http://www.oldboyedu.com/get_user/                - http://www. ...

  9. 关于Django中,实现序列化的几种不同方法

    前言 关于序列化操作,就是将一个可迭代的数据结构,通过便利的方式进行我们所需要的操作. 今天历来归纳一下,Django中的几种不同得分方法,已经Django-restframework提供的方法 创建 ...

随机推荐

  1. Golang Json文件解析为结构体工具-json2go

    代码地址如下:http://www.demodashi.com/demo/14946.html 概述 json2go是一个基于Golang开发的轻量json文件解析.转换命令行工具,目前支持转换输出到 ...

  2. 1078. Hashing (25)【Hash + 探測】——PAT (Advanced Level) Practise

    题目信息 1078. Hashing (25) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B The task of this problem is simple: in ...

  3. 无限极分类php实现—查子孙树、家谱树

    1.本文更新日期:2018/05/20 , 亲测可用,在原有基础上进行增强和 详细化 . 2.面包屑导航 和 子孙树 效果图如下: 3.代码: <?php // 无限级分类中,查家谱树(面包屑导 ...

  4. 国内最火的五款HTML5前端开发框架

    2013-04-11 本文主要为大家推荐五款国内最火的HTML5前端开发框架,它们分别是腾讯团队开发的JX.淘宝团队开发的KISSY.百度团队开发的QWrap和Tangram,以及上海康尚实验室推出的 ...

  5. spring+mybatis+atomikos 实现JTA事务

    1. 选择哪种transaction manager?      在单数据源情况下,JDBC,Hibernate,ibatis等自带的 transaction manager已能用于处理事务.     ...

  6. [转]深入理解Java之线程池

    原文链接 原文出处: 海 子 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这 ...

  7. 理解iOS与函数式编程

    有时候,一个关键字就是一扇通往新世界的大门.两年前,身边开始有人讨论函数式编程,拿关键字Functional Programming一搜,全是新鲜的概念和知识,顺藤摸瓜,看到的技术文章和框架也越来越多 ...

  8. Virtualbox虚拟机克隆

    Vmware Workstation可以提供虚拟机的克隆,可以安装好虚拟机之后可以非常方便的复制一个虚拟机,这样在搭建多台虚拟机的环境下非常方便,无需一台台的安装系统,但是Virtualbox在图形界 ...

  9. kubernetes架构之二

    一.概述 IaaS:即基础设施即服务,通过虚拟化和分布式存储等技术,实现对包括服务器.存储设备.网络设备等各种物理资源的抽象:从而形成了一个可扩展.可按需分配的虚拟资源池.最具代表性的IaaS产品有A ...

  10. SDL相关学习

    原文地址:https://www.cnblogs.com/landmark/category/311822.html 介绍SDL图形库的使用 SDL显示文字 摘要: 前面教程里,我们只显示图片,没提到 ...