关于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"}}