关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式
1、serializers
1 from django.core import serializers 2 ret = models.BookType.objects.all() 3 data = serializers.serialize("json", ret)
2、json.dumps
1 import json 2 3 #ret = models.BookType.objects.all().values('caption') 4 ret = models.BookType.objects.all().values_list('caption') 5 6 ret=list(ret) #列表化QuerySet,得到列表的基本数据类型,可以序列化 7 8 result = json.dumps(ret)
#序列化方法一
1 ################### views.py ################### 2 def xuliehua(request): 3 return render(request,'xuliehua.html') 4 5 #实现方式一 6 def get_data(request): 7 user_list = models.UserInfo.objects.all() 8 return render(request,'get_data.html',{'user_list':user_list}) ### 传给前端的是已经渲染好的get_data.html的字符串
1 ################### xuliehua.html ################### 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7 </head> 8 <body> 9 <h1>用户列表</h1> 10 <table id="tb"> 11 12 </table> 13 <script src="/static/jquery-3.3.1.min.js"></script> 14 <script> 15 $(function () { 16 initData(); 17 }); 18 function initData() { 19 $.ajax({ 20 url: '/get_data/', 21 type: 'GET', 22 dataType: 'JSON', //这里不需要JSON 23 success:function (arg) { 24 {#第一种#} 25 {#$('#tb').append(arg);#} 26 } 27 } 28 }) 29 } 30 </script> 31 </body> 32 </html>
1 ################### get_data.html ################### 2 {% for row in user_list %} 3 <tr> 4 <td>{{ row.id }}</td> 5 <td>{{ row.username }}</td> 6 <td>{{ row.email }}</td> 7 </tr> 8 {% endfor %}
#序列化方法二
1 ################### views.py ################### 2 def get_data(request): 3 from django.core import serializers 4 ret = {'status':True,'data':None} 5 try: 6 # QuerySet内部的三种数据类型 -> 序列化处理 7 # ①对象:QuerySet[obj.obj....] 8 user_list = models.UserInfo.objects.all() 9 ret['data'] = serializers.serialize("json",user_list) #只能直接用于对象 10 # ②字典:QuerySet[{},{},{}...] 11 user_list = models.UserInfo.objects.all().values('id','username') 12 ret['data'] = list(user_list) 13 # ③元组:QuerySet[(),(),()] 14 user_list = models.UserInfo.objects.all().values_list('id', 'username') 15 ret['data'] = list(user_list) 16 except Exception as e: 17 ret['status'] = False 18 # result = json.dumps(ret) 报错的位置 19 # QuerySet不能直接被序列化 20 # 报错:TypeError: Object of type 'QuerySet' is not JSON serializable 21 result = json.dumps(ret) 22 return HttpResponse(result)
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>用户列表</h1> 9 <table id="tb"> 10 11 </table> 12 <script src="/static/jquery-3.3.1.min.js"></script> 13 <script> 14 $(function () { 15 initData(); 16 }); 17 function initData() { 18 $.ajax({ 19 url: '/get_data/', 20 type: 'GET', 21 dataType: 'JSON', 22 success:function (arg) { 23 {#第一种#} 24 {#$('#tb').append(arg);#} 25 {#第二种#} 26 if(arg.status){ 27 {#QuerySet内的①进行了两次序列化#} 28 {#后台对data的值进行了两次序列化,这里也要两次反序列化#} 29 {#var v = JSON.parse(arg.data);#} 30 {#console.log(v);#} 31 {#QuerySet内的②③中的data对应的值可以直接处理,不需要再次序列化#} 32 console.log(arg.data); 33 } 34 } 35 }) 36 } 37 </script> 38 </body> 39 </html>
由于json.dumps时无法处理datetime日期,所以可以通过自定义处理器来做扩展,如:
1 import json 2 from datetime import date 3 from datetime import datetime 4 5 class JsonCustomEncoder(json.JSONEncoder): 6 7 def default(self, field): 8 9 if isinstance(field, datetime): 10 return o.strftime('%Y-%m-%d %H:%M:%S') 11 elif isinstance(field, date): 12 return o.strftime('%Y-%m-%d') 13 else: 14 return json.JSONEncoder.default(self, field) 15 16 17 # ds = json.dumps(d, cls=JsonCustomEncoder) 18 信号