django 使用serializers進行前後端數據傳輸

問題引出

  • 在開發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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章