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)