Django restful Framework 之序列化与反序列化
2016-11-11 15:44
155 查看
1. 首先在已建好的工程目录下新建app命名为snippets,并将snippets app以及rest_framework app加到工程目录的 INSTALLED_APPS 中去,具体如下:
1.1构建自己的数据库表结构,代码如下:
生成表结构命令如下:
1.2创建序列化类
为我们的web API提供一种针对建立models snippets 对象的序列化与反序列化的方式,并展示出来,比如json格式, 我们可以定义序列化类,和Django 中的forms比较相似的功能,接下来在
snippets目录下创建serializers.py, 具体如下:
A serializer class is very similar to a Django
The field flags can also control how the serializer should be displayed in certain circumstances, such as when rendering to HTML. The
We can actually also save ourselves some time by using the
接下来进入django的shell 环境,创建models实例,步骤如下:
views.py
在app snippets中创建urls.py 具体如下:
在project 的url中定义总的路由对应关系,具体如下:
接下来运行一下搭建好的demo,我们可以借助用python写的httpie测试,安装方式如下:
测试方法如下:
通过下面的方式也可以测试具体snippet
INSTALLED_APPS = ( ... 'rest_framework', 'snippets.apps.SnippetsConfig', )
1.1构建自己的数据库表结构,代码如下:
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()) 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 snippets python manage.py migrate
1.2创建序列化类
为我们的web API提供一种针对建立models snippets 对象的序列化与反序列化的方式,并展示出来,比如json格式, 我们可以定义序列化类,和Django 中的forms比较相似的功能,接下来在
snippets目录下创建serializers.py, 具体如下:
from rest_framework import serializers from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES class SnippetSerializer(serializers.Serializer): 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'}) linenos = serializers.BooleanField(required=False) language = serializers.ChoiceField(choices=LANGUAGE_CHOICES, default='python') style = serializers.ChoiceField(choices=STYLE_CHOICES, default='friendly') def create(self, validated_data): """ Create and return a new `Snippet` instance, given the validated data. """ return Snippet.objects.create(**validated_data) def update(self, instance, validated_data): """ Update and return an existing `Snippet` instance, given the 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
A serializer class is very similar to a Django
Formclass, and includes similar validation flags on the various fields, such as
required,
max_lengthand
default.
The field flags can also control how the serializer should be displayed in certain circumstances, such as when rendering to HTML. The
{'base_template': 'textarea.html'}flag above is equivalent to using
widget=widgets.Textareaon a Django
Formclass. This is particularly useful for controlling how the browsable API should be displayed, as we'll see later in the tutorial.
We can actually also save ourselves some time by using the
ModelSerializerclass, as we'll see later, but for now we'll keep our serializer definition explicit.
接下来进入django的shell 环境,创建models实例,步骤如下:
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): """ An HttpResponse that renders its content into JSON. """ def __init__(self, data, **kwargs): content = JSONRenderer().render(data) kwargs['content_type'] = 'application/json' super(JSONResponse, self).__init__(content, **kwargs) @csrf_exempt def snippet_list(request): """ List all code snippets, or create a new snippet. """ if request.method == 'GET': snippets = Snippet.objects.all() serializer = SnippetSerializer(snippets, many=True) return JSONResponse(serializer.data) elif request.method == 'POST': data = JSONParser().parse(request) serializer = SnippetSerializer(data=data) if serializer.is_valid(): serializer.save() return JSONResponse(serializer.data, status=201) return JSONResponse(serializer.errors, status=400) @csrf_exempt def snippet_detail(request, pk): """ Retrieve, update or delete a 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 == 'PUT': 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=204)
views.py
在app snippets中创建urls.py 具体如下:
from django.conf.urls import url from snippets import views urlpatterns = [ url(r'^snippets/$', views.snippet_list), url(r'^snippets/(?P<pk>[0-9]+)/$', views.snippet_detail), ]
在project 的url中定义总的路由对应关系,具体如下:
from django.conf.urls import url, include urlpatterns = [ url(r'^/rest_api/', include('snippets.urls')), ]
接下来运行一下搭建好的demo,我们可以借助用python写的httpie测试,安装方式如下:
pip install httpie
测试方法如下:
localhost:cmdb JasonWang$ http http://127.0.0.1:8000/rest_api/snippets/ HTTP/1.0 200 OK Content-Type: application/json Date: Fri, 11 Nov 2016 08:24:52 GMT Server: WSGIServer/0.2 CPython/3.5.0 X-Frame-Options: SAMEORIGIN [ { "code": "foo = \"Jason\"\n", "id": 1, "language": "python", "linenos": false, "style": "friendly", "title": "" }, { "code": "print \"Hello,Jason\"\n", "id": 2, "language": "python", "linenos": false, "style": "friendly", "title": "" }, { "code": "print \"Hello,Jason\"", "id": 3, "language": "python", "linenos": false, "style": "friendly", "title": "" } ]
通过下面的方式也可以测试具体snippet
localhost:cmdb JasonWang$ http http://127.0.0.1:8000/rest_api/snippets/2/ HTTP/1.0 200 OK Content-Type: application/json Date: Fri, 11 Nov 2016 08:28:32 GMT Server: WSGIServer/0.2 CPython/3.5.0 X-Frame-Options: SAMEORIGIN { "code": "print \"Hello,Jason\"\n", "id": 2, "language": "python", "linenos": false, "style": "friendly", "title": "" }
相关文章推荐
- Django serializers 序列化 rest_framework
- django序列化时如何添加一个customer filed NOT in my model?
- python3-开发进阶Django中序列化以及rest_framework的序列化
- django(6)model表语句操作、Form操作、序列化操作
- django Rest Framework 系列 1 - 序列化 Serialization
- django restframework 序列化
- Django之信号和序列化
- Django自定义数据段问题即 [] is not JSON serializable(数组非JSON序列化)
- django queryset 序列化为 json 数据
- Django rest framework(6)----序列化
- django--缓存,序列化,信号
- Django REST FrameWork中文教程1:序列化
- Django的序列化
- 关于Django的序列化
- Django REST framework 序列化与反序列化
- django文件上传和序列化
- django-rest-framework指南(1):序列化
- Django 序列化与反序列化
- 21:序列化django对象
- Python的Django REST框架中的序列化及请求和返回