對於查詢數據,若是使用ajax請求發送數據,獲取數據後,如何在前臺展現,那麼就須要後臺返回json數據,在前臺處理。javascript
情景一: html
後臺查詢的是queryset ,裏面是一個個對象,也就是使用了all()方法。java
後臺處理:python
用到了django 提供的序列化。jquery
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) 序列化的結果反序列化, 才獲得對象。ajax
<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); }) })
情景二: django
後臺查詢的是queryset ,裏面是字段或元組,也就是使用了value_list()方法。json
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基本數據類型的報錯app
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)