Django序列化

发布时间 2023-12-06 17:34:56作者: 木屐呀

关于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 信号