zoukankan      html  css  js  c++  java
  • django的序列化

    关于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 json
    from datetime import date
    from datetime import datetime
    from decimal import Decimal
    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, Decimal):
                return str(field)
            else:
                return json.JSONEncoder.default(self, field)
    

     那么怎么应用呢?

    看案例:

    import json
    from datetime import date
    from datetime import datetime
    from decimal import Decimal
    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, 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
  • 相关阅读:
    CRM 常用SQL 脚本
    Dynamic CRM 2013学习笔记(十七)JS读写各种类型字段方法及技巧
    Winform Treeview 排序及图标处理
    Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用
    sql server 小技巧(3) SQL Server 2012 数据库完整导出到SQL Azure (包括数据)
    解决iOS Xcode 模拟器键盘不弹出
    iOS核心动画
    PS中怎么给图层解锁
    Cocos2d-x设置吞没单击属性来避免精灵重叠被点击后的事件续传
    解决Cocos2d-x编译错误: 无法打开 源 文件 "extensions/ExtensionExport.h"
  • 原文地址:https://www.cnblogs.com/renfanzi/p/5815231.html
Copyright © 2011-2022 走看看