問題引出
- 在開發django網站應用的時候,由於是MVC架構,因此肯定會接觸到數據在前後端之間的傳輸。主要有數據從後端傳輸到前端和從前端傳輸到後端。
- 對於數據從前端傳輸到後端,使用ajax比較方便頁面部分加載更新,使用get或post通過request傳輸,也比較方便。看具體頁面的需求,選擇不同的傳輸方式。
- 數據從後端傳輸到前端顯示,一種是渲染整個頁面,推薦使用locals(),所有變量在前端模板中可用;另一種是ajax請求,通過JsonResponse()返回,一般要求返回字典格式的數據。此時如果你想把篩選的model結果傳輸至前臺,那麼在後端數據組包和前端解析就比較麻煩。
無意中發現django有序列化對象函數serializers,使用起來非常方便。
serializers的使用
官方文檔使用說明:
Interfaces for serializing Django objects.
Usage::
from django.core import serializers # 導入函數
json = serializers.serialize("json", some_queryset) # 序列化
objects = list(serializers.deserialize("json", json)) # 反序列化
下面我們以一個具體例子解釋使用:
前端js:
$.ajax ({
type: "GET",
url: "/productManage/repo_warning_query/",
dataType: 'json',
data: {
},
success: function (displayList) {
var half_Y = JSON.parse(displayList.half_Y);
}
});
後端處理:
def repo_warning_query(request):
if request.method == 'GET'and request.is_ajax():
now = datetime.datetime.now()
date_map = {"半年以內": datetime.timedelta(days=30 * 6),
"一年": datetime.timedelta(days=30 * 12),
"兩年": datetime.timedelta(days=30 * 24),
"三年": datetime.timedelta(days=30 * 36),
}
all_items = ItemsLocation.objects.all().order_by('-updatedDateTime')
queryset= all_items.filter(updatedDateTime__gte=(now-date_map['半年以內']))
back_info = serializers.serialize('json',queryset)
JsonBackInfo ={'half_Y':back_info}
return JsonResponse(JsonBackInfo)
- 前端通過ajax請求,進入後端repo_warning_query函數中,函數處理,獲取model篩選的queryset集合,注意,數據類型一定得是queryset,然後
back_info = serializers.serialize('json',queryset)
進行序列化處理,返回至前端。在前端中,使用JSON.parse(displayList.half_Y)
;進行解包,成JSON格式,此時在前端js中使用返回數值進行相關處理非常方便。
官方文檔連接:https://docs.djangoproject.com/en/2.2/topics/serialization/