Serializers-处理查询数据

1.查询结果转json

django查询数据返回的是可迭代的queryset序列,如果不习惯这种数据,可以用serializers方法转成json数据,更直观。

返回json数据,需要用到JsonResponse。django查询数据库返回json有3种方法:

  • serializers转json
  • model_to_dict转字典
  • values()转list (最简单,推荐!)

JsonResponse是HttpResponse的一个子类,用来帮助用户创建JSON编码的响应。源码:

class JsonResponse(data,encoder=DjangoJSONEncoder,safe=True,json_dumps_params=None,**kwargs):
  • data: 应该传递一个标准的python字典给它,它将其转换成json格式数据。
  • encoder:默认为django.core.serializers.json.DjangoJSONEncoder,用于序列化data。
  • safe: 默认为True。如果为True但data不是dict对象,将抛出一个Typeerror;如果为False,可以传递任何对象进行序列化。
  • json_dumps_params:可以传递一个python标准的json库中,json.dump()方法处理后的对象给它,用于生成一个响应。

另外:它默认Content-Type头部设置为application/json。以下为JsonResponse类源码:

serializers 转json

django里有个serializers方法可以,直接把查询的结果转换成json数据。

from django.http import HttpResponse,JsonResponse
from helloApp.models import Person
from django.core import serializers
import json
def get_json(request):
    data = {}
    allPer = Person.objects.all()
    data['result'] = json.loads(serializers.serialize("json",allPer))
    return JsonResponse(data)

结果如下:

{"result": [{"model": "helloApp.person", "pk": 6, "fields": {"name": "\u66f9\u96e8\u751f", "age": 5000}}, {"model": "helloApp.person", "pk": 7, "fields": {"name": "\u53f6\u51e1", "age": 2000}}, {"model": "helloApp.person", "pk": 8, "fields": {"name": "\u66f9\u96e8\u751f", "age": 2000}}, {"model": "helloApp.person", "pk": 9, "fields": {"name": "\u5e1d\u5c0a", "age": 120000}}, {"model": "helloApp.person", "pk": 10, "fields": {"name": "\u5e1d\u5c0a", "age": 120000}}]}

serializers方法虽然可以直接转换成json数据,但是上面返回的结果有一些多余的字段model和pk,不是我们想要的。

model_to_dict 转字典

用model_to_dict方法把查询的queryset序列结果转成字典序列。

from django.http import HttpResponse,JsonResponse
from helloApp.models import Person 
from django.forms.models import model_to_dict
def to_dict(request):
    ret = Person.objects.all()
    json_list = []
    for i in ret:
        json_dict = model_to_dict(i)
        json_list.append(json_dict)
    return JsonResponse(json_list,safe=False)

结果如下:

[{"id": 6, "name": "\u66f9\u96e8\u751f", "age": 5000}, {"id": 7, "name": "\u53f6\u51e1", "age": 2000}, {"id": 8, "name": "\u66f9\u96e8\u751f", "age": 2000}, {"id": 9, "name": "\u5e1d\u5c0a", "age": 120000}, {"id": 10, "name": "\u5e1d\u5c0a", "age": 120000}]

values() 转list

第三种:不需要导入方法,先用values()方法获取一个可迭代的dict序列,再用list函数转成list对象。

from django.http import HttpResponse,JsonResponse
from helloApp.models import Person
def json_data(request):
    data = {}
    ret = Person.objects.all().values()
    data["data"] = list(ret)
    return JsonResponse(data,safe=False)

然后在urls.py配置访问地址,如下:

    url(r'^json_data$',testdb.json_data),

结果如下:

{"data": [{"id": 6, "name": "\u66f9\u96e8\u751f", "age": 5000}, {"id": 7, "name": "\u53f6\u51e1", "age": 2000}, {"id": 8, "name": "\u66f9\u96e8\u751f", "age": 2000}, {"id": 9, "name": "\u5e1d\u5c0a", "age": 120000}, {"id": 10, "name": "\u5e1d\u5c0a", "age": 120000}]}

2.JsonResponse返回中文

django查询到的结果,用JsonResponse返回在页面上显示类似于"\u66f9\u96e8\u751f",这是unicode编码,python3默认返回的编码。解决:加上参数 json_dumps_params={'ensure_ascii':False}

from django.http import HttpResponse,JsonResponse
from helloApp.models import Person
def json_data(request):
    data = {}
    ret = Person.objects.all().values()
    data["data"] = list(ret)
    return JsonResponse(data,safe=False,
                        json_dumps_params={'ensure_ascii':False})

结果如下:

{"data": [{"id": 6, "name": "曹雨生", "age": 5000}, {"id": 7, "name": "叶凡", "age": 2000}, {"id": 8, "name": "曹雨生", "age": 2000}, {"id": 9, "name": "帝尊", "age": 120000}, {"id": 10, "name": "帝尊", "age": 120000}]}

posted @   夜久听山雨  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示