day22-Django序列化操作
一、前言
之前我们学习过python的序列化,用json模块,他只能支持python的一些基本数据类型,复杂的数据类型,比如是类,函数等等,它是序列化不了的,所以我们这边对于django而已,我们需要序列化,比如,正常的python简单的字段序列化是可以,但是遇到复杂的,比如说:date,datetime模块的,还有就是queryset数据类型的,还有正常的ERROR报错的,这个我们是没有办法序列化的,所以我们需要自己手动的去定制一些序列化操作。关于Django中的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的为Json格式。
二、ErrorDict
说明:遇到复杂的数据类型,需要自定义encoder的序列化,由于json.dumps时无法处理datetime日期,所以可以通过自定义处理器来做扩展,如:
import json from datetime import date,datetime class JsonCustomEncoder(json.JSONEncoder): def default(self, field): if isinstance(field, datetime): return o.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(field, date): return o.strftime('%Y-%m-%d') else: return json.JSONEncoder.default(self, field) ds = json.dumps(d, cls=JsonCustomEncoder)
注意了:这个cls是序列化的时候,对每一个字段序列化的时候,都会调用一个它的default方法
三、Queryset序列化
3.1、serializers
说明:正常的我们的queryset类型的数据进行序列化
from django.core import serializers ret = models.BookType.objects.all() data = serializers.serialize("json", ret)
3.2、json.dumps
说明:如果我们序列化values_list的queryset对象的时候,我们需要用json.dumps
import json #ret = models.BookType.objects.all().values('caption') ret = models.BookType.objects.all().values_list('id','caption') ret=list(ret) result = json.dumps(ret)
但是如果我们的values_list中有负载的数据类型,比如说有时间类型,等等,那处理办法如下:
import json from datetime import date from datetime import datetime #自定义encoder class JsonCustomEncoder(json.JSONEncoder): def default(self, field): if isinstance(field, datetime): return o.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(field, date): return o.strftime('%Y-%m-%d') else: return json.JSONEncoder.default(self, field) #再序列化带有类似于ctime复杂的数据类型 ret = models.BookType.objects.all().values_list('caption','ctime') ret=list(ret) result = json.dumps(ret, cls=JsonCustomEncoder)