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)  

 

posted @ 2018-05-04 14:18  帅丶高高  阅读(203)  评论(0编辑  收藏  举报