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
  • 相关阅读:
    国外高手又一力作,CAML Builder
    用word2007发布blog!!
    SharePoint Server 2007 trial 年末大餐细细品尝 (第八口)
    SharePoint Server 2007 trial 年末大餐细细品尝 (再来一口)
    SharePoint Server 2007 trial 年末大餐细细品尝 (第三口)
    SharePoint Server 2007 trial 年末大餐细细品尝 (第十口)
    卡壳了~~~
    SharePoint Server 2007 trial 年末大餐细细品尝 (第九口)
    moss 与 ad 用户信息不同步的问题。
    SharePoint Server 2007 trial 年末大餐细细品尝 (第六口)
  • 原文地址:https://www.cnblogs.com/renfanzi/p/5815231.html
Copyright © 2011-2022 走看看