Django REST framework序列化器是什么
在Django中唯袄,序列化器是將模型類轉(zhuǎn)換成Json或者Xml格式數(shù)據(jù)并對數(shù)據(jù)進行驗證米碰,具體表現(xiàn)在:
1讥裤,Django從后臺向前臺傳遞數(shù)據(jù)時將會將模型類轉(zhuǎn)換成Json格式數(shù)據(jù)返回給前端乒裆,
2,前端向后臺請求數(shù)據(jù)時對數(shù)據(jù)進行驗證并處理數(shù)據(jù)(驗證數(shù)據(jù)不一定處理召嘶,但是處理數(shù)據(jù)時必須先驗證數(shù)據(jù)),
為什么要返回Json數(shù)據(jù)
Json是一種簡單的數(shù)據(jù)交換格式哮缺,因為格式簡潔弄跌,易于讀取,這樣前臺就可以一眼就看出數(shù)據(jù)中的內(nèi)容尝苇,方便檢查排錯同時可通過JavaScript進行解析铛只,不管傳輸還是解析效率都很高,所以一般前臺都會要求后臺返回json格式的數(shù)據(jù)糠溜。
Django怎么返回Json數(shù)據(jù)
現(xiàn)在我們在models.py中新建一個模型類,這里我定義一個電影類淳玩,這里我定義了3個簡單的類,在film中關(guān)聯(lián)了其他2個類非竿。
為了更加方便快捷的操作蜕着,這里我創(chuàng)建了一個Django超級管理員,在admin后臺添加了些簡單的數(shù)據(jù)進去红柱,在admin.py文件中注冊下我們的模型類承匣,如下圖所示。
from django.contrib import admin
from user.models import Performer,Type,Film
# Register your models here.
class FilmAdmin(admin.ModelAdmin):
# 指定要顯示的屬性
list_display = ["id", "film_name", "performer", "film_type", "time", "film_url", "desc"]
admin.site.register(Performer)
admin.site.register(Type)
admin.site.register(Film,FilmAdmin)
下來我們就來通過視圖獲取電影的全部數(shù)據(jù)锤悄,現(xiàn)在我們新建一個測試文件dome.py韧骗,我們來測試下我們獲取到的數(shù)據(jù)格式,首先我先設(shè)置文件然后導(dǎo)入這幾張表和models零聚,沒有前面這三行程序會報錯:django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings袍暴。
這里我們可以看到,獲取到的是個 QuerySet對象
接著我們繼續(xù)獲取隶症,使用Django為我們提供的values方法來獲取對象中的值容诬,這里我們可以看到我們已經(jīng)可以讀取到對應(yīng)的數(shù)據(jù)和關(guān)聯(lián)鍵了,但這里我們獲取到的數(shù)據(jù)類型還是QuerySet對象沿腰。
現(xiàn)在用list()方法轉(zhuǎn)換下數(shù)據(jù)類型,將QuerySet對象強制轉(zhuǎn)換成數(shù)組狈定,這里我們可以看到前面已經(jīng)沒有顯示QuerySet颂龙,而是[{...}习蓬,{...}]數(shù)組格式。
但這里我們還發(fā)現(xiàn)個問題措嵌,在這些數(shù)據(jù)中還有兩個外鍵關(guān)聯(lián)的數(shù)據(jù)并沒有顯示值躲叼,而是對應(yīng)的id,要獲取這兩個外鍵的值我們還需要獲取Type和Performer的列表信息企巢,通過指定的id來獲取對應(yīng)的值枫慷,這里我們可以直接用filter方法來獲取,這樣我們才算真正獲取到了我們需要的所有參數(shù)值了浪规。
總結(jié):通過Django我們需要將數(shù)據(jù)進行幾次轉(zhuǎn)換才能提取到我們所需的數(shù)據(jù)信息或听,出現(xiàn)關(guān)聯(lián)時我們還需要進一步的對數(shù)據(jù)進行查詢獲取,操作還是挺麻煩的笋婿。
接下來我們用REST framework序列化器來試試同樣獲取當前的數(shù)據(jù)誉裆,看看是如何操作的。首先我們目前已經(jīng)建立了數(shù)據(jù)模型類缸濒,所以這里我們直接在當前文件下創(chuàng)建一個序列化器足丢,新建一個serializers.py文件,引入serializers:from rest_framework import serializers庇配,接著導(dǎo)入我們的模型類斩跌。
同樣我們用dome.py來測試下獲取的數(shù)據(jù)時什么樣的,我們可以從下圖中看出捞慌,通過使用REST framework序列化器耀鸦,我們可以很簡單的獲取到我們想要的數(shù)據(jù),而不用進行多次的轉(zhuǎn)換卿闹。
這里我們看到后臺獲取到的是OrderedDict數(shù)據(jù)揭糕,這是一種有序的字典數(shù)據(jù)結(jié)構(gòu)。那么前臺拿到的是什么類型的呢锻霎,這里我們寫個視圖函數(shù)輸出一下著角,在views.py中我們寫個簡單的視圖,然后配上路由旋恼。
現(xiàn)在我們啟動下服務(wù)吏口,看下該路由下獲取到的數(shù)據(jù)到底是什么形式的,這里我們可以看到給前臺返回的數(shù)據(jù)是個列表元素冰更,每部電影的數(shù)據(jù)意字典的形式嵌套在里面产徊,而外鍵中的數(shù)據(jù)同樣以字典的形式內(nèi)嵌在電影中,前臺只要依次遍歷就可以獲取到對應(yīng)的數(shù)據(jù)了蜀细。