首页 > 代码库 > django的序列化

django的序列化

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

 

两种方法:

方法一:serializers:

缺点就是只能应用于对象

            """            ret = models.Book.objects.filter(con)            print(ret) # queryset,[对象]  #就是上面是列表            from django.core import serializers            #这种方法是django的自己的序列化方法,但是有个缺点,下面这句的ret只能是对象,所以只能用第二种方式            data = http://www.mamicode.com/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 = http://www.mamicode.com/json.dumps(li)"""

 但是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 = http://www.mamicode.com/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 = http://www.mamicode.com/json.dumps(li)>"""            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

 

django的序列化