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))