zoukankan      html  css  js  c++  java
  • django 序列化

    对于查询数据,如果使用ajax请求发送数据,获取数据后,如何在前台展示,那么就需要后台返回json数据,在前台处理。

    情景一: 

      后台查询的是queryset ,里面是一个个对象,也就是使用了all()方法。

    后台处理:

      用到了django 提供的序列化。

    from app01 import models
    import datetime
    import json
    from django.core import serializers
    from django.shortcuts import render, HttpResponse
    
    
    def xlh(request):
        message = {'status': False, 'da': None, 'error': None}
    
        if request.method == 'GET':
    
            return render(request, 'xlh.html')
        else:
            data = models.Book.objects.all()
            data = serializers.serialize('json', data)
            print(type(data))
            message['da'] = data
            message['status'] = True
            return HttpResponse(json.dumps(message, ensure_ascii=False))

    前台在反序列化时, 反序列了两次, 第一次是将 json.dumps()序列化的结果 反序列化, 第二次是将  serializers.serialize('json', data) 序列化的结果反序列化, 才得到对象。

    <script src="/static/js/jquery-3.2.1.min.js"></script>
    <script>
        $('button').click(function () {
             $.post('/xlh/',{}, function (arg) {
                 arg = eval('(' + arg + ")");  # 第一次
                 if(arg.status){
                     var data = eval('(' + arg.da + ")");  # 第二次
                 }
                 console.log(arg);
                 console.log(data);
        })
        })
    

    情景二: 

      后台查询的是queryset ,里面是字段或元组,也就是使用了value_list()方法。

    def xlh1(request):
        message = {'status': False, 'da': None, 'error': None}
    
        if request.method == 'GET':
    
            return render(request, 'xlh.html')
        else:
            data = models.Book.objects.all().values_list('id', 'title', 'price')
            message['da'] = list(data)
            message['status'] = True
            return HttpResponse(json.dumps(message, ensure_ascii=False, cls=JsonCustomEncoder))
    

      

    <script src="/static/js/jquery-3.2.1.min.js"></script>
    <script>
        $('button').click(function () {
             $.post('/xlh1/',{}, function (arg) {
                 arg = eval('(' + arg + ")");
                 if(arg.status){
                 }
                 console.log(arg);
        })
        })

    反序列化时,处理不是python基本数据类型的报错

    import json
    from datetime import date
    from datetime import datetime
    from decimal import Decimal
    
    
    class JsonCustomEncoder(json.JSONEncoder):
    
        def default(self, field):
            if isinstance(field, datetime):
                return field.strftime('%Y-%m-%d %H:%M:%S')
            elif isinstance(field, date):
                return field.strftime('%Y-%m-%d')
            elif isinstance(field, Decimal):
                return str(field)
            else:
                return json.JSONEncoder.default(self, field)
  • 相关阅读:
    Android:控件GridView的使用
    Android:监听ListView
    Android:控件ListView列表项与适配器结合使用
    Android:删除模拟器中没用的应用
    Android:Activity之间跳转和参数传递
    Android:常见错误提示
    删除appcompat_v7会出很多错误
    Android工具:延展图片NinePatch
    Android:布局实例之模仿QQ登录界面
    Android:android:gravity 和 android:layout_Gravity 的区别
  • 原文地址:https://www.cnblogs.com/liyqiang/p/8709391.html
Copyright © 2011-2022 走看看