django中怎么将valuesqueryset转换成json-亚博电竞手机版

今天就跟大家聊聊有关django中怎么将valuesqueryset转换成json,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

在使用valuesqueryset存放查询结果时,有时需要转为json,但并不能直接使用json.dumps()直接转,而是需要经过下面一个步骤:

result_set=apple.objects.all().values()  printtype(result_set) data_list=result_set[:]#queryset转为list printtype(data_list)

output:

 

经过转换之后,data_list可以使用json.dumps()转为json;

为什么要有valuesqueryset?

查询内容直接转为字典形式,方便后续使用;

可以指定查询哪一列;例如apple.objects.all().values(‘id'),只会查询表中的id这一列;

补充知识:python对象转json【包括嵌套对象转json,django的model转json】

背景:

给app写接口时经常会遇到将一个model转为json返回。

问题:

网上也有类似方法,只是搜索结果多少有些问题,总是搜了好一会儿才找到合适的方法,另外,网上更多集中的只是简单些的对象,对于复杂的对象,还是不容易找到好的方式。

方案(python3.6):

1对象转json:

model类

classpeople(): def__init__(self,name,age,pet): self.name=name self.age=age self.pet=pet classpet(): def__init__(self,pet_type,pet_name): self.pet_type=pet_type self.pet_name=pet_name

将pet对象转json:

importjson defpet2json(): pet=pet('cat','lili') js=json.dumps(pet.__dict__) print(js)

结果:

{“pet_type”: “cat”, “pet_name”: “lili”}

小结:充分利用了python对象的dict方法,python下一切皆对象,每个对象都有多个属性(attribute),python对属性有一套统一的管理方案。dict是用来存储对象属性的一个字典,其键为属性名,值为属性的值。dict可直接json化。

2嵌套对象转json:

刚才的people类可看做是嵌套类,即有一个属性是另一个类的实例,此时,若用上面的方法来json化person对象,会有问题,如下【错误】:

defsimple_person(): pet=pet('cat','lili') p=people('xiaoming',12,pet) json_data=json.dumps(p.__dict__) print(json_data)

结果:

报异常typeerror: object of type ‘pet' is not json serializable

原因:json只能针对json serializable对象直接进行json化,而一般只有内置的类型,比如string,int,list和dict等才能直接序列化,代码中p._ dict _是个dict类型,但是其pet属性仍是自定义的类,是不能直接json化的。

解决方式【正确】:

defsimple_person(): pet=pet('cat','lili') p=people('xiaoming',12,pet.__dict__) json_data=json.dumps(p.__dict__) print(json_data)

结果:

{“name”: “xiaoming”, “age”: 12, “pet”: {“pet_type”: “cat”, “pet_name”: “lili”}}

小结:充分利用_ dict _方法。

3django的model转json:

首先有个model类

classperson(models.model): name=models.charfield(max_length=50,null=false) age=models.integerfield(default=0) pid=models.charfield(max_length=20,unique=true) gender=models.integerfield(default=0)

针对该person类,有两种常见情况需要提供其json:

1:根据pid查询person记录;

2:根据某些条件,查询一些person记录。

此时数据库里已经插入了一些数据

这里要提一下网上比较常见的一种方式,需要用到django.core.serializers,这个类的serialize(format, queryset, **options)方法,很明显,这个方式只能作用与queryset格式,并且通过例子(不再列出),得到的结果类似这种 [{“model”: “polls.person”, “pk”: 2, “fields”: {“name”: “cysion”, “age”: 29, “pid”: “3708261989”, “gender”: 0}}],出现了model,pk,field等属性,不但用不到(对app来说),而且还增加了其它属性的使用复杂度。这个在亚博电竞手机版官网的说明文档里也是如此处理,但是作者并不推荐。

方案:

我们还是使用_ dict _这个利器,首先,我们根据pid获得一个person对象,然后利用dict方法打印看看结果(错误)

req_pid=3708262007//request中得到 try: rt=person.objects.get(pid=req_pid) print(rt.__dict__) returnhttpresponse(json.dumps(rt.__dict__),content_type='application/json') #returnjsonresponse(rt.__dict__,safe=false)//另一种方式 except: returnjsonresponse(datalogic.get_comon_resp(1,'没有查询到对应数据'))

结果是:

print结果{‘_state': < django.db.models.base.modelstate object at 0x0000000004c80860 >, ‘id': 17, ‘name': ‘zhaoliu', ‘age': 10, ‘pid': ‘3708262007', ‘gender': 1}

啧啧,又多了些属性,特别是这个_state,是不能序列化的,所以上述并不能直接返回想要的结果。

解决方式:既然_state无用,且影响了结果,那我们直接临时除去,不就返回了想要的结果吗(正确)。

req_pid=request.post.get('pid') try: rt=person.objects.get(pid=req_pid) rt.__dict__.pop("_state") returnjsonresponse(rt.__dict__,safe=false) except: returnjsonresponse(datalogic.get_comon_resp(1,'没有查询到对应数据'))

接口返回结果是:

{ "id":17, "name":"zhaoliu", "age":10, "pid":"3708262007", "gender":1 }

正是客户端需要的。

最后,是返回列表的,比如需要这种结果

{ "code":0, "msg":"成功", "data":[ { "id":2, "name":"cysion", "age":29, "pid":"3708261989", "gender":0 }, { "id":11, "name":"sophia", "age":22, "pid":"3708261998", "gender":1 }, { "id":15, "name":"lisi", "age":13, "pid":"3708262005", "gender":0 } ] }

实现思路同上面类似,首先数据库查询后得到queryset,其不能直接json化(通过serializer得到的不好看,也不好处理,大量的属性处理还比较费劲),需要将其遍历得到每个对象,然后将其属性字典加入到list中,最后将其添加到通用dict中

pers=person.objects.all() result={"code":0,"msg":"成功"} l=[] forpinpers: p.__dict__.pop("_state")//需要除去,否则不能json化 l.append(p.__dict__)//注意,实际是个json拼接的过程,不能直接添加对象 result['data']=l

这个时候result 就是个可以直接json化的对象了,通过

return jsonresponse(result, safe=false)

看完上述内容,你们对django中怎么将valuesqueryset转换成json有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注恰卡编程网行业资讯频道,感谢大家的支持。

展开全文
内容来源于互联网和用户投稿,文章中一旦含有亚博电竞手机版的联系方式务必识别真假,本站仅做信息展示不承担任何相关责任,如有侵权或涉及法律问题请联系亚博电竞手机版删除

最新文章

网站地图