django rest_framework(二)——序列化

 

1.新建一個app snippetscss

python manage.py startapp snippets

更新配置文件tutorial/settings.py,註冊到APPShtml

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

2.建立Model,定義實體
編輯snippets/models.py,添加Snippet模型,該模型用來存儲代碼片斷python

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,代碼以下:django

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格式數據,新增或修改對象。原理以下: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對象swift

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

使用Serializer類序列化Snippet對象api

# 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格式數據markdown

使用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訪問

相關文章
相關標籤/搜索