关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。

我们从数据库取出数据的格式有三种:1、all()返回的是QuerySet对象;2、values()返回的是QuerySet对象的字典类型;3、vlaues_list() 返回的QuerySet对象的元组类型

1、第2和第3种都可以在后端通过json.dumps()传递给前端。

******后端获取quesyset对象*******
import json
ret = models.BookType.objects.all().values('caption')
ret = models.BookType.objects.all().values_list('caption')
ret=list(ret)
result = json.dumps(ret)
*******前端ajax******
前端ajax接受的数据通过JSON.parse(data) 将后端传递的quesyset数据进行转换

2、对于第1种情况:需要serializers将获取的QuerySet对象进行序列化转换才可以传递给前端

*******后端从数据库提取数据*********
from django.core import serializers
ret = models.BookType.objects.all()
data = serializers.serialize("json", ret)#注意serializers只能对QuerySet对象进行序列化转换
*******前端对得到的数据通过JSON.parse(data)进行转换

由于json.dumps时无法处理datetime日期,所以可以通过自定义处理器来做扩展,如:import json 

from datetime import date 
from datetime import datetime 
   
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') 
        else: 
            return json.JSONEncoder.default(self, field) 
   
 d=datetime.now()
ds = json.dumps(d, cls=JsonCustomEncoder) #调用基类的用法json.dunmps

上一步相当于:
a=datetime.now()
cls=JsonCustomEncoder()
d=cls.default(a)
ds = json.dumps(d)

 如果需要对一个对象做序列化:

 例如:

data={

  'time':datatime.now()

  'response':Foo('adc')#字典中存在一个类的实例化对象,则也无法对其进行序列化

  }

class Foo():
    def __init__(self,data):
        self.data=data

解决办法,在JsonCustomEncoder中加入对象的序列化

from datetime import date 
from datetime import datetime
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, Foo):
return field.__dict__ # 返回对象的属性字典就可以对对象进行序列化了
else:
return json.JSONEncoder.default(self, field)#如果传入的数据类型不是上面的时间格式或者对象格式,按原生的json格式数据
ds = json.dumps(data, cls=JsonCustomEncoder) 
print(ds)
*****结果*******
{"time": "2019-06-18 15:48:58", "response": {"data": "abc"}}

 

posted on 2019-06-04 11:26  赏孤舟蓑笠  阅读(187)  评论(0编辑  收藏  举报