31)django-序列化

目录

  1)序列化

  2)为什么不用json序列化

  3)django序列化QuerySet,ErrorDict数据

一:序列化

  序列化是将对象状态转换为可保持或传输的格式的过程

  反序列化是指将存储在存储媒体中的对象状态装换成对象的过程 

二:为什么不用json序列化

  json序列化只能序列python自己对象:比如字符串,数据,字典等。但是像时间,django Queryset 或者是ErrorDict类型数据不能直接序列化。

三:django序列化QuerySet,ErrorDict数据

  1)对QuerySet序列化
  2)ErrorDict序列化



    #1)对QuerySet序列化
    -自定义encoder
    -对models.tb.objects.all()序列化
    #第一种
     django提供序列化
        from django.core import serializers
        v=models.tb.objects.all()
        data=serializers.serialize("json",v)

    #第二种
        v=models.tb.objects.all().values("id","name")
        v=list(v)#把Queryset直接转列表
        v=json.dumps(v)

        但是如果有ctime类型,就不能直接使用

        json.dumps(v,cls="XX")去定制


    第一种方法把所有字段都列表出了。第二种可以定制,比如只显示name等


#2)ErrorDict序列化(也有两种,as_json as_data)
详细例子:http://www.cnblogs.com/lixiang1013/p/7892181.html
class JsonCustomEncoder(json.JSONEncoder): from django.core.exceptions import ValidationError def default(self, field): if isinstance(field,ValidationError): return {'code':field.code,'message':field.messages} else: return json.JSONEncoder.default(self,field) def login(request): res={"status":False,"data":None,"error":None} if request.method=="GET": return render(request,"login.html") elif request.method=="POST": obj=LoginForm(request.POST) if obj.is_valid(): print(obj.cleand_data) res["status"]=True else: #res["error"]=obj.errors.as_json() #print(obj.errors.as_data())#errors.as_data()返回的是 ValidationError类型,不是字典,不能直接序列化 res["error"]=obj.errors.as_data() result=json.dumps(res,cls=JsonCustomEncoder)#dumps有个参数cls,可以定制 return HttpResponse(json.dumps(result))

 

posted on 2017-11-26 17:07  shisanjun  阅读(221)  评论(0编辑  收藏  举报

导航