django序列化

django在使用ajax发送数据的时候只能以字符串的形式发送,故而,如果需要发送queryset数据类型的时候是不可以发送的,为此,django使用了一个模块来为此提供支持

使用erializers模块序列化

可以序列化queryset类型

def get_data(request):
    user_list = models.UserInfo.objects.all
    from django.core import serializers
    user_list_str = serializers.serialize('json', user_list)
    return HttpResponse(user_list_str)

使用这种方式虽然简单粗暴,但是会将表名等信息暴露,因此不推荐

使用json序列化

def get_data(request):
    user_list = models.UserInfo.objects.val('name', 'pwd')
    user_list = list(user_list)
    val = json.dumps(user_list)
    return HttpResponse(val)

但是json只能处理基础的列表,字典等简单类型,他不能处理时间等复杂类型

自定义json

自定制 json.dumps方法中cls参数(serializers内部也是这样实现的)

vale=json.dumps(userlist,cls=json.JSONEncoder)

from datetime import datetime
from datetime import date
import json
#自定义一个类,由于Python的一数据类型,json可以序列化,所有可以继承json.JSONEncoder方法
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)
data_list=[
    {'name':'eric0','age':18,'ctime':datetime.now()},
    {'name':'eric1','age':18,'ctime':datetime.now()},
    {'name':'eric2','age':18,'ctime':datetime.now()}
]

str1=json.dumps(data_list, cls=JsonCustomEncoder)
print(str1)

你可能感兴趣的:(django序列化)