在前一节中,我们已经粗略地介绍了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. 使用Thrift让Python为Java提供服务

    Thrift是基于TCP的,谷歌的GRPC是基于HTTP的.Thrift和GRPC都是比直接写个web接口进行调用更完美的方式,最明显的一点就是:我们可以定义结构体,避免了手动解析的过程. 但是,在将 ...

  2. java struts2入门学习--防止表单重复提交.OGNL语言学习

    一.知识点回顾 防止表单重复提交核心思想: 客户端和服务器端和写一个token,比较两个token的值相同,则非重复提交;不同,则是重复提交. 1.getSession三种方式比较: request. ...

  3. iOS 如何写出更加严谨的应用

    本文旨在介绍一些能够帮助大家避开一些开发误区的经验. 一: 在开发中,经常能够遇到共用同一个界面的情况,一般情况下,我们会根据传入的model去做数据处理和保存. 当然如果不存在复用的情况下,根本不需 ...

  4. Oracle中INTERSECT,MINUS,UNION,UNION ALL用法

    intersect 就是交集minus 就是差集 交集就是两个结果集中都有的元素 比如 select uid from tb1 intersect select uid from tb2 那么既存在t ...

  5. HDU 1896 Stones (优先队列)

    Stones Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Subm ...

  6. .net core 实现默认图片

    web 上 如果图片不存在 一般是打xx  这时候 一般都是会设置默认的图片 代替   现在用中间件的方式实现统一设置   一次设置 全部作用 .net core 实现默认图片 Startup 文件 ...

  7. http1.0 和 http1.1 主要区别

    1.背景   KeepAlive是就是通常所称的长连接.KeepAlive带来的好处是可以减少tcp连接的开销,这对于短response body的请求效果更加明显.同时,可以为采用HTTP协议的交互 ...

  8. python dict 和 json 互转

    在Python语言中,json数据与dict字典以及对象之间的转化,是必不可少的操作. 在Python中自带json库.通过import json导入. import json 在json模块有2个方 ...

  9. Android Activity全面解析

    Android Activity全面解析 首先,就从Android四大组件Activity开始. 1.Activity生命周期方法完全解析   activity_lifecycle.png 1).on ...

  10. 在Windows系统上怎么使用SecureCRT链接Linux AWS EC2 -摘自网络

    在Windows系统上就需要使用SecureCRT,Putty等工具,进行连接.但是AWS提供的XXX.pem文件,需要做一些处理SecureCRT的方法: 1.使用XXX.pem文件生成一个公钥文件 ...