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

 

posted @ 2016-09-16 23:03  我当道士那儿些年  阅读(574)  评论(0编辑  收藏  举报