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)
原文地址:https://www.cnblogs.com/liyqiang/p/8709391.html