对于查询数据,如果使用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)
来源:oschina
链接:https://my.oschina.net/u/4329479/blog/4082383