1. 程式人生 > >django rest framework 入門1-序列化 Serialization

django rest framework 入門1-序列化 Serialization

************************************

推廣一下目前的公司:

小得——知識技能分享平臺,通過知識分享,獲取收益,打造個人品牌和知識網紅

www.exuetech.com

************************************

1. 設定一個新的環境

在我們開始之前, 我們首先使用virtualenv要建立一個新的虛擬環境,以使我們的配置和我們的其他專案配置徹底分開。

  $mkdir ~/env

$virtualenv  ~/env/tutorial

$source ~/env/tutorial/bin/avtivate

現在我們處在一個虛擬的環境中,開始安裝我們的依賴包

$pip install django

$pip install djangorestframework

$pip install pygments   ////使用這個包,做程式碼高亮顯示

需要退出虛擬環境時,執行deactivate。更多資訊,irtualenv document

2. 開始

環境準備好只好,我們開始建立我們的專案

$ cd ~

$ django-admin.py startproject tutorial

$ cd tutorial

專案建立好後,我們再建立一個簡單的app

$python manage.py startapp snippets

我們使用sqlite3來執行我們的專案tutorial,編輯tutorial/settings.py, 將資料庫的預設引擎engine改為sqlite3, 資料庫的名字NAME改為tmp.db

DATABASES ={'default':{'ENGINE':'django.db.backends.sqlite3','NAME':'tmp.db','USER':'','PASSWORD':'','HOST':'','PORT':'',}}
同時更改settings.py檔案中的INSTALLD_APPS,新增我們的APP snippets和rest_framework
INSTALLED_APPS =(...'rest_framework','snippets',)
在tutorial/urls.py中,將snippets app的url包含進來
urlpatterns = patterns
('', url(r'^', include('snippets.urls')),)
3. 建立Model

這裡我們建立一個簡單的nippets model,目的是用來儲存程式碼片段。

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())classSnippet(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, 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)classMeta:
        ordering =('created',)
完成model時,記得sync下資料庫

python manage.py syncdb

4. 建立序列化類

我們要使用我們的web api,要做的第一件事就是序列化和反序列化, 以便snippets例項能轉換為可表述的內容,例如json. 我們宣告一個可有效工作的序列器serializer。在snippets目錄下面,該序列器與django 的表單形式很類似。建立一個serializers.py ,並將下面內容拷貝到檔案中。

from django.forms import widgets
from rest_framework import serializers
from snippets.models importSnippetclassSnippetSerializer(serializers.Serializer):
    pk = serializers.Field()# Note: `Field` is an untyped read-only field.
    title = serializers.CharField(required=False,
                                  max_length=100)
    code = serializers.CharField(widget=widgets.Textarea,
                                 max_length=100000)
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=models.LANGUAGE_CHOICES,
                                       default='python')
    style = serializers.ChoiceField(choices=models.STYLE_CHOICES,
                                    default='friendly')def restore_object(self, attrs, instance=None):"""
        Create or update a new snippet instance.
        """if instance:# Update existing instance
            instance.title = attrs['title']
            instance.code = attrs['code']
            instance.linenos = attrs['linenos']
            instance.language = attrs['language']
            instance.style = attrs['style']return instance

        # Create new instancereturnSnippet(**attrs)

該序列化類的前面部分,定義了要序列化和反序列化的型別,restore_object 方法定義瞭如何通過反序列化資料,生成正確的物件例項。

我們也可以使用ModelSerializer來快速生成,後面我們將節省如何使用它。

5. 使用 Serializers

在我們使用我們定義的SnippetsSerializers之前,我們先熟悉下Snippets. 

 $python manage.py shell

進入shell終端後,輸入以下程式碼:

from snippets.models importSnippetfrom snippets.serializers importSnippetSerializerfrom rest_framework.renderers importJSONRendererfrom rest_framework.parsers importJSONParser

snippet =Snippet(code='print "hello, world"\n')
snippet.save()
我們現在獲得了一個Snippets的例項,現在我們對他進行以下序列化
serializer =SnippetSerializer(snippet)
serializer.data
# {'pk': 1, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'}
這時,我們將該例項轉成了python原生的資料型別。下面我們將該資料轉換成json格式,以完成序列化:
content =JSONRenderer().render(serializer.data)
content
# '{"pk": 1, "title": "", "code": "print \\"hello, world\\"\\n", "linenos": false, "language": "python", "style": "friendly"}'
反序列化也很簡單,首先我們要將一個輸入流(content),轉換成python的原生資料型別
importStringIO

stream =StringIO.StringIO(content)
data =JSONParser().parse(stream)
然後我們將該原生資料型別,轉換成物件例項
serializer =SnippetSerializer(data=data)
serializer.is_valid()# True
serializer.object
# <Snippet: Snippet object>
注意這些API和django表單的相似處。這些相似點, 在我們講述在view中使用serializers時將更加明顯。

6. 使用 ModelSerializers

SnippetSerializer使用了許多和Snippet中相同的程式碼。如果我們能把這部分程式碼去掉,看上去將更佳簡潔。

類似與django提供Form類和ModelForm類,Rest Framework也包含了Serializer 類和 ModelSerializer類。

開啟snippets/serializers.py ,修改SnippetSerializer類:

classSnippetSerializer(serializers.ModelSerializer):classMeta:
        model =Snippet
        fields =('id','title','code','linenos','language','style')

7. 通過Serializer編寫Django View

讓我們來看一下,如何通過我們建立的serializer類編寫django view。這裡我們不使用rest framework的其他特性,僅編寫正常的django view。

我們建立一個HttpResponse 子類,這樣我們可以將我們返回的任何資料轉換成json。

在snippet/views.py中新增以下內容:

from django.http importHttpResponsefrom django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers importJSONRendererfrom rest_framework.parsers importJSONParserfrom snippets.models importSnippetfrom snippets.serializers importSnippetSerializerclassJSONResponse(HttpResponse):"""
    An HttpResponse that renders it's content into JSON.
    """def __init__(self, data,**kwargs):
        content =JSONRenderer().render(data)
        kwargs['content_type']='application/json'
        super(JSONResponse, self).__init__(content,**kwargs)
我們API的目的是,可以通過view來列舉全部的Snippet的內容,或者建立一個新的snippet
@csrf_exemptdef snippet_list(request):"""
    List all code snippets, or create a new snippet.
    """if request.method =='GET':
        snippets =Snippet.objects.all()
        serializer =SnippetSerializer(snippets)returnJSONResponse(serializer.data)elif request.method =='POST':
        data =JSONParser().parse(request)
        serializer =SnippetSerializer(data=data)if serializer.is_valid():
            serializer.save()returnJSONResponse(serializer.data, status=201)else:returnJSONResponse(serializer.errors, status=400)
注意,因為我們要通過client向該view post一個請求,所以我們要將該view 標註為csrf_exempt, 以說明不是一個CSRF事件。

Note that because we want to be able to POST to this view from clients that won't have a CSRF token we need to mark the view as csrf_exempt. This isn't something that you'd normally want to do, and REST framework views actually use more sensible behavior than this, but it'll do for our purposes right now.

我們也需要一個view來操作一個單獨的Snippet,以便能更新/刪除該物件。

@csrf_exemptdef snippet_detail(request, pk):"""
    Retrieve, update or delete a code snippet.
    """try:
        snippet =Snippet.objects.get(pk=pk)exceptSnippet.DoesNotExist:returnHttpResponse(status=404)if request.method =='GET':
        serializer =SnippetSerializer(snippet)returnJSONResponse(serializer.data)elif request.method =='PUT':
        data =JSONParser
            
           

相關推薦

django rest framework 入門1序列 Serialization

************************************ 推廣一下目前的公司: 小得——知識技能分享平臺,通過知識分享,獲取收益,打造個人品牌和知識網紅 www.exuetech.com ***********************************

Django rest framework(6)----序列

目錄 序列化 1.繼承Serializer 基本使用  (1)models.py from django.db import models class UserInfo(models.Model): USER_TYPE = ( (1,'普通使用者'),

rest-framework組件 之 序列

link 優化 操作 self. req elf clas erro django f 瀏覽目錄 簡單使用 ModelSerializer 提交post請求 重寫save的create方法 單條數據的get和put請求

Rest Framework:二、序列元件

一、序列化元件 序列化元件的使用 -Serializer             -1 重新命名:用source:xx = serializers.Ch

django Rest Framework 系列 1

$mkdir ~/env $virtualenv ~/env/tutorial $source ~/env/tutorial/bin/avtivate 現在我們處在一個虛擬的環境中,開始安裝我們的依賴包 $pip install django

Django-Rest-Framework序列之serializers 序列元件

Django-Rest-Framework的序列化之serializers 序列化元件     正常的序列化 from django.http import HttpResponse, JsonResponse from django.views import View

django rest framework序列的原始碼流程剖析

當要對資料物件進行序化列例項化的時候 1 def __new__(cls, *args, **kwargs): 2 # We override this method in order to automagically create 3 # `ListSeria

Django rest framework 序列元件

最近在DRF的序列化上踩過了不少坑,特此結合官方文件記錄下,方便日後查閱。 【01】前言    serializers是什麼?官網是這樣的”Serializers allow complex data such as querysets and model instances to be converte

django rest framework 序列元件總結

序列化元件總結 一. 序列化元件本質上為了實現前後端分離,而進行json序列化的一個元件形式,極大方便了解析資料的作用 二. 所有序列化是基於APIView 解析器實現的,通過內部的多繼承關係方便實現進行資料序列化的實現 三 使用方式 1.基於APIView 引入  from rest

django雜記(cookiecutter-django / django-rest-framework序列

2018-09-26 Django Rest Framework Authentication Tutorial urlpatterns = [ path('', views.PostList.as_view()), path('<int

Django REST Framework 序列和校驗 知識點

any 組件 imp 圖片 png 添加 obj ons self. DRF序列化   Django ORM對象 --> JSON格式的數據  序列化   JSON格式的數據 --> Django ORM數據  反序列化   需要兩個工具: f

django rest framework序列器2

定義Serializer 1. 定義方法 Django REST framework中的Serializer使用類來定義,須繼承自rest_framework.serializers.Serializer。注意:serializer不是隻能為資料庫模型類定義,也可以為非資

Django REST framework 序列與反序列

對於序列化和反序列化,其實一直都是懵懵懂懂,不知道為什麼要序列化?序列化好處在哪裡? 今天抽空小記一下,持續更新........POST 請求---------> 反序列化過程------->deserializer: Json → native datatype

Django REST framework - 序列

sent 社會 from splay 使用 父類 ali self har 目錄 Django REST framework 序列化 DRF 序列化的本質 DRF中序列化工具

Django REST framework 序列

序列化 將程式中的一個數據結構型別轉換為其他格式(字典、JSON、XML等),例如將Django中的模型類物件裝換為JSON字串,這個轉換過程我們稱為序列化。 反之,將其他格式(字典、JSON、XML等)轉換為程式中的資料,例如將JSON字串轉換為Django中

python學習-- Django REST framework 序列數據操作

如何 ive 使用 str bsp 返回 時間 改變 新聞 一.為什麽要返回json數據? 一般來說前端要用到從後臺返回的數據來渲染頁面的時候,這時候後臺就需要向前端返回json類型的數據,簡單直觀便於理解 ,就類似於 {"xxx":{["name":xxx,"ag

DRF Django REST framework序列(三)

Django 原生 serializer (序列化) 匯入模組  from django.core.serializers import serialize  獲取 queryset  對 queryset 進行序列化 將序列化之後的資料

Django REST framework 的快速入門教程

ret turn ads 使用 blog 所有 定義 想去 cti CRM-API項目搭建 序列器(Serializers) 首先,我們來定義一些序列器。我們來創建一個新的模塊(module)叫做 crm/rest_searializer.py ,這是我們用來描述數據是如何

[Django rest-framework] 1-Serialization

www. spa key blog urn allow max pytho led 個人粗淺的理解,歡迎批評指正 什麽是序列化?   後端任務無非對數據庫的增查刪改,操作數據庫無非操作字段,序列化可以讓我們輕松的對數據庫增(serializer.create)改(seril

django-rest-framework快速入門

1-1 finally erl his 常見 router ger pla har 前言:第一次接觸django-rest-framework是在實習的時候。當時也不懂,看到視圖用類方法寫的感覺很牛逼的樣子。因為官網是英文的,這對我的學習還是有一點的阻力的,所以當時也沒怎麽