django的序列化
2016-09-16 23:03
375 查看
关于django的序列化主要应用在将数据库中检索的数据返回给客户端用户,特别的Ajax请求一般返回的Json格式
两种方法:
但是json.dumps时无法处理datetime日期和小数,所以无法通过自定义处理器来做扩展,
如:
那么怎么应用呢?
看案例:
views.index.py
两种方法:
方法一: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
相关文章推荐
- Django serializers 序列化 rest_framework
- Django model序列化为json的方法示例
- Django 之REST framework学习1:Serialization(序列化)
- django Rest Framework 系列 1 - 序列化 Serialization
- Django-rest-framework (一)、序列化
- django(6)model表语句操作、Form操作、序列化操作
- Django Rest Framework源码剖析(六)-----序列化(serializers)
- django的序列化
- django文件上传和序列化
- django的序列化问题
- DjangoRestFramework的外键反向关系序列化的一个问题
- 在django中使用itsdangerous库进行数据序列化
- Django restful Framework 之序列化与反序列化
- Django的序列化
- Django框架全面讲解 -- 序列化
- 关于Django的序列化
- Django-Rest frameworw之序列化
- django-rest-framework指南(1):序列化
- Django中datetime不是Json序列化问题的解决
- Django 序列化与反序列化