博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django的序列化
阅读量:6767 次
发布时间:2019-06-26

本文共 3713 字,大约阅读时间需要 12 分钟。

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

 

两种方法:

方法一:serializers:

缺点就是只能应用于对象

"""            ret = models.Book.objects.filter(con)            print(ret) # queryset,[对象]  #就是上面是列表            from django.core import serializers            #这种方法是django的自己的序列化方法,但是有个缺点,下面这句的ret只能是对象,所以只能用第二种方式            data = serializers.serialize("json", ret)            print(type(data),data)            # 字符串            """

 方法二:json.dumps

"""            #ret = models.Book.objects.filter(con).values('name','book_type__caption')            ret = models.Book.objects.filter(con).values_list('name', 'book_typ__ecaption')            print(ret,type(ret))            li = list(ret)            #这种方式也有一个缺点,就是date和小数的时候不能序列化,所以需要自定义类并继承            data = json.dumps(li)            print(data,type(data))            """

 但是json.dumps时无法处理datetime日期和小数,所以无法通过自定义处理器来做扩展,

如:

import jsonfrom datetime import datefrom datetime import datetimefrom decimal import Decimalclass 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, Decimal):            return str(field)        else:            return json.JSONEncoder.default(self, field)

 那么怎么应用呢?

看案例:

import jsonfrom datetime import datefrom datetime import datetimefrom decimal import Decimalclass 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, Decimal):            return str(field)        else:            return json.JSONEncoder.default(self, field)def index(request):    if request.method == 'POST':        ret = {
'status': False, 'message': '', 'data':None} try: post_data = request.POST.get('post_data',None) post_data_dict = json.loads(post_data) print(post_data_dict) # {'name': ['11', 'sdf'],'price': ['11', 'sdf']} # 构造搜索条件 from django.db.models import Q con = Q() for k,v in post_data_dict.items(): q = Q() q.connector = 'OR' for item in v: q.children.append((k, item)) con.add(q, 'AND') """ ret = models.Book.objects.filter(con) print(ret) # queryset,[对象] #就是上面是列表 from django.core import serializers #这种方法是django的自己的序列化方法,但是有个缺点,下面这句的ret只能是对象,所以只能用第二种方式 data = serializers.serialize("json", ret) print(type(data),data) # 字符串 """ """ #ret = models.Book.objects.filter(con).values('name','book_type__caption') ret = models.Book.objects.filter(con).values_list('name', 'book_typ__ecaption') print(ret,type(ret)) li = list(ret) #这种方式也有一个缺点,就是date和小数的时候不能序列化,所以需要自定义类并继承 data = json.dumps(li) print(data,type(data)) """ print(type(con)) result = models.Book.objects.filter(con).values('name','price','pubdate','book_type__caption') # ret = models.Book.objects.filter(con).values_list('name', 'book_type__caption') li = list(result) ret['status'] = True ret['data'] = li except Exception as e: ret['message'] = str(e) ret_str = json.dumps(ret, cls=JsonCustomEncoder) return HttpResponse(ret_str) return render(request, 'input.html')
views.index.py

 

转载地址:http://diseo.baihongyu.com/

你可能感兴趣的文章
从超大规模云服务提供商处学习效率
查看>>
dtcoretext概要
查看>>
最好用的Android黑客应用程序和工具
查看>>
编程方法论/架构设计/模式相关转载链接汇总
查看>>
揭秘白帽黑客:优秀女白帽子比大熊猫还稀罕
查看>>
在虚拟机中配置NLB网络负载均衡
查看>>
[翻译] ADPopupView 触摸弹出视窗
查看>>
MySQL配置文件my.ini参数注释说明
查看>>
矩阵的乘法算法
查看>>
跨服务器查询
查看>>
Memory Barriers/Fences
查看>>
浅谈缓冲区溢出之栈溢出<下>
查看>>
谈谈代码重构
查看>>
如何搭建移动端CSS样式库
查看>>
Android之SpannableString、SpannableStringBuilder总结
查看>>
自定义注解
查看>>
陌陌前端面试 - 凉面
查看>>
react页面引导组件, 支持语音播报
查看>>
PHP中的MySQL使用--基于PDO
查看>>
你必须要了解的异步
查看>>