Django框架 序列化

序列化:将内存对象转化成字节数据(可存储/传输的形式)
相反的过程(从字节数据中提取数据结构)称为反序列化
#在后端,即Python代码部分:通常使用json模块
json.dumps(<x>):将内存对象转换为JSON str
  #仅能用于Python的基本数据类型
json.loads(<data>):将JSON str转换为内存对象(提取数据结构)

JSON.parse()参见:
https://www.runoob.com/js/javascript-json-parse.html
JSON.stringify()参见:
https://www.runoob.com/js/javascript-json-stringify.html

//在前端,即JS代码部分:
JSON.parse(<text>[,<reviver>]):JSON str转换为内存对象
  //参数说明:
    text:指定JSON str
    reviver:1个用于转换结果的函数,将对转换后的对象中的每个成员调用此函数
JSON.stringify(<obj>[,<replacer>,<space>]):将内存对象转换为JSON str
  //参数说明:
    obj:指定内存对象
    replacer:用于转换结果的函数/数组
    space:添加缩进/空格/换行符
      如果为num,则返回值在每个级别缩进指定数目的空格(>10,相当于10)
      也可以为非数字,:\t
#views.py:

from django.shortcuts import render,redirect,HttpResponse
from app01 import models
import json
from django.core import serializers

#返回页面:
def ser(req):
    return render(req,"ser.html")

#返回页面上的数据:
def get_data(req):
    ret={"status":True,"data":None}
    try:
        #如果是通过render()发送页面+数据:
        #user_list=models.UserInfo.objects.all()

        #如果是通过HttpResponse()只发送数据:
        #1.如果QuerySet内部不是Python的基本数据类型:
        #user_list=models.UserInfo.objects.all()#为QuerySet
          #该方式仅在内部非Python基本数据类型(如为Datetime)时使用
        #ret["data"]=serializers.serialize("json",user_list)
          #第1个参数表示序列化成什么格式(此处是json)
          #第2个参数表示要序列化什么(此处是user_list)
          #serializers只能序列化QuerySet
        #2.如果QuerySet内部是Python的基本数据类型:
        user_list=models.UserInfo.objects.all().values("id","username")
          #user_list内部是1个个dict(如果内部是tuple同理)
        ret["data"]=list(user_list)#将QuerySet转换成list

    except Exception as e:
        ret["status"]=False

    #return render(req,"get_data.html",{"user_list":user_list})
      #返回的是页面+数据构成的str
      #缺点:需要返回整个页面,当页面很庞大时,效率低下,故不常用

    result=json.dumps(ret)
      #json无法序列化QuerySet,故需要先用.seiralize()序列化user_list
    return HttpResponse(result)
      #只返回数据构成的str.不返回页面内容
<!--ser.html:-->

<body>
    <h4>用户列表</h4>
    <table id="tb">
    </table>
    <script src="/static/jquery-3.1.1.js"></script>
    <script>
        $(function () {
            initData()
        })
        function initData() {
            $.ajax({
                url:"/get_data",
                type:"GET",
                dataType:"JSON",
                success:function (arg) {
                    //如果是通过render()发送页面+数据:
                    //$("#tb").append(arg)

                    //如果是通过HttpResponse()只发送数据:
                    if(arg.status) {
                        //1.如果序列化了2次:
                        //此时arg.data是json,需要反序列化
                        //var v=JSON.parse(arg.data);
                        //console.log(v);

                        //2.如果只序列号了1次:
                        console.log(arg.data);
                    }
                }
            })
        }
    </script>
<body>
<!--get_data.html:-->

{% for row in user_list %}
    <tr>
        <td>{{row.id}}</td>
        <td>{{row.username}}</td>
        <td>{{row.email}}</td>
    </tr>
{% endfor %}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值