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/

你可能感兴趣的:(django)