电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Django ValuesQuerySet轉(zhuǎn)json方式

瀏覽:82日期:2024-05-28 17:21:38

在使用ValuesQuerySet存放查詢結(jié)果時(shí),有時(shí)需要轉(zhuǎn)為json,但并不能直接使用json.dumps()直接轉(zhuǎn),而是需要經(jīng)過(guò)下面一個(gè)步驟:

result_set = Apple.objects.all().values()print type(result_set)data_list = result_set[:] # queryset轉(zhuǎn)為listprint type(data_list)

output:

<class ’django.db.models.query.ValuesQuerySet’><type ’list’>

經(jīng)過(guò)轉(zhuǎn)換之后,data_list可以使用json.dumps()轉(zhuǎn)為json;

為什么要有ValuesQuerySet?

查詢內(nèi)容直接轉(zhuǎn)為字典形式,方便后續(xù)使用;

可以指定查詢哪一列;例如Apple.objects.all().values(‘id’),只會(huì)查詢表中的id這一列;

補(bǔ)充知識(shí):Python對(duì)象轉(zhuǎn)json【包括嵌套對(duì)象轉(zhuǎn)json,django的model轉(zhuǎn)json】

背景:

給app寫接口時(shí)經(jīng)常會(huì)遇到將一個(gè)model轉(zhuǎn)為json返回。

問(wèn)題:

網(wǎng)上也有類似方法,只是搜索結(jié)果多少有些問(wèn)題,總是搜了好一會(huì)兒才找到合適的方法,另外,網(wǎng)上更多集中的只是簡(jiǎn)單些的對(duì)象,對(duì)于復(fù)雜的對(duì)象,還是不容易找到好的方式。

方案(python3.6):

1對(duì)象轉(zhuǎn)json:

model類

class People(): def __init__(self, name, age, pet): self.name = name self.age = age self.pet = petclass Pet(): def __init__(self, pet_type, pet_name): self.pet_type = pet_type self.pet_name = pet_name

將Pet對(duì)象轉(zhuǎn)json:

import jsondef pet2json(): pet = Pet(’Cat’, ’Lili’) js = json.dumps(pet.__dict__) print(js)

結(jié)果:

{“pet_type”: “Cat”, “pet_name”: “Lili”}

小結(jié):充分利用了Python對(duì)象的dict方法,Python下一切皆對(duì)象,每個(gè)對(duì)象都有多個(gè)屬性(attribute),Python對(duì)屬性有一套統(tǒng)一的管理方案。dict是用來(lái)存儲(chǔ)對(duì)象屬性的一個(gè)字典,其鍵為屬性名,值為屬性的值。dict可直接json化。

2嵌套對(duì)象轉(zhuǎn)json:

剛才的People類可看做是嵌套類,即有一個(gè)屬性是另一個(gè)類的實(shí)例,此時(shí),若用上面的方法來(lái)json化Person對(duì)象,會(huì)有問(wèn)題,如下【錯(cuò)誤】:

def simple_person(): pet = Pet(’Cat’, ’Lili’) p = People(’Xiaoming’, 12,pet) json_data = json.dumps(p.__dict__) print(json_data)

結(jié)果:

報(bào)異常TypeError: Object of type ‘Pet’ is not JSON serializable

原因:json只能針對(duì)JSON serializable對(duì)象直接進(jìn)行json化,而一般只有內(nèi)置的類型,比如string,int,list和dict等才能直接序列化,代碼中p._ dict _是個(gè)dict類型,但是其pet屬性仍是自定義的類,是不能直接json化的。

解決方式【正確】:

def simple_person(): pet = Pet(’Cat’, ’Lili’) p = People(’Xiaoming’, 12,pet.__dict__) json_data = json.dumps(p.__dict__) print(json_data)

結(jié)果:

{“name”: “Xiaoming”, “age”: 12, “pet”: {“pet_type”: “Cat”, “pet_name”: “Lili”}}

小結(jié):充分利用_ dict _方法。

3django的model轉(zhuǎn)json:

首先有個(gè)model類

class Person(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)

針對(duì)該P(yáng)erson類,有兩種常見(jiàn)情況需要提供其json:

1:根據(jù)pid查詢person記錄;

2:根據(jù)某些條件,查詢一些person記錄。

此時(shí)數(shù)據(jù)庫(kù)里已經(jīng)插入了一些數(shù)據(jù)

這里要提一下網(wǎng)上比較常見(jiàn)的一種方式,需要用到django.core.serializers,這個(gè)類的serialize(format, queryset, **options)方法,很明顯,這個(gè)方式只能作用與queryset格式,并且通過(guò)例子(不再列出),得到的結(jié)果類似這種 [{“model”: “polls.person”, “pk”: 2, “fields”: {“name”: “Cysion”, “age”: 29, “pid”: “3708261989”, “gender”: 0}}],出現(xiàn)了model,pk,field等屬性,不但用不到(對(duì)app來(lái)說(shuō)),而且還增加了其它屬性的使用復(fù)雜度。這個(gè)在官網(wǎng)的說(shuō)明文檔里也是如此處理,但是作者并不推薦。

方案:

我們還是使用_ dict _這個(gè)利器,首先,我們根據(jù)pid獲得一個(gè)Person對(duì)象,然后利用dict方法打印看看結(jié)果(錯(cuò)誤)

req_pid=3708262007//request中得到 try: rt = Person.objects.get(pid=req_pid) print(rt.__dict__) return HttpResponse(json.dumps(rt.__dict__),content_type=’application/json’) # return JsonResponse(rt.__dict__, safe=False)//另一種方式 except: return JsonResponse(datalogic.get_comon_resp(1, ’沒(méi)有查詢到對(duì)應(yīng)數(shù)據(jù)’))

結(jié)果是:

print結(jié)果{‘_state’: < django.db.models.base.ModelState object at 0x0000000004C80860 >, ‘id’: 17, ‘name’: ‘zhaoliu’, ‘a(chǎn)ge’: 10, ‘pid’: ‘3708262007’, ‘gender’: 1}

嘖嘖,又多了些屬性,特別是這個(gè)_state,是不能序列化的,所以上述并不能直接返回想要的結(jié)果。

解決方式:既然_state無(wú)用,且影響了結(jié)果,那我們直接臨時(shí)除去,不就返回了想要的結(jié)果嗎(正確)。

req_pid = request.POST.get(’pid’) try: rt = Person.objects.get(pid=req_pid) rt.__dict__.pop('_state') return JsonResponse(rt.__dict__, safe=False) except: return JsonResponse(datalogic.get_comon_resp(1, ’沒(méi)有查詢到對(duì)應(yīng)數(shù)據(jù)’))

接口返回結(jié)果是:

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

正是客戶端需要的。

最后,是返回列表的,比如需要這種結(jié)果

{ '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 } ]}

實(shí)現(xiàn)思路同上面類似,首先數(shù)據(jù)庫(kù)查詢后得到QuerySet,其不能直接json化(通過(guò)serializer得到的不好看,也不好處理,大量的屬性處理還比較費(fèi)勁),需要將其遍歷得到每個(gè)對(duì)象,然后將其屬性字典加入到list中,最后將其添加到通用dict中

pers = Person.objects.all()result = {'code':0,'msg':'成功'}L = []for p in pers: p.__dict__.pop('_state')//需要除去,否則不能json化 L.append(p.__dict__)//注意,實(shí)際是個(gè)json拼接的過(guò)程,不能直接添加對(duì)象result [’data’] = L

這個(gè)時(shí)候result 就是個(gè)可以直接json化的對(duì)象了,通過(guò)

return JsonResponse(result, safe=False)

可以返回上面需要的結(jié)果。

主要提供了思路,詳細(xì)代碼就不提供了。

以上這篇Django ValuesQuerySet轉(zhuǎn)json方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 【铜排折弯机,钢丝折弯成型机,汽车发泡钢丝折弯机,线材折弯机厂家,线材成型机,铁线折弯机】贝朗折弯机厂家_东莞市贝朗自动化设备有限公司 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 东莞螺杆空压机_永磁变频空压机_节能空压机_空压机工厂批发_深圳螺杆空压机_广州螺杆空压机_东莞空压机_空压机批发_东莞空压机工厂批发_东莞市文颖设备科技有限公司 | 大型多片锯,圆木多片锯,方木多片锯,板材多片锯-祥富机械有限公司 | 加气混凝土砌块设备,轻质砖设备,蒸养砖设备,新型墙体设备-河南省杜甫机械制造有限公司 | 刺绳_刀片刺网_刺丝滚笼_不锈钢刺绳生产厂家_安平县浩荣金属丝网制品有限公司-安平县浩荣金属丝网制品有限公司 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 食药成分检测_调料配方还原_洗涤剂化学成分分析_饲料_百检信息科技有限公司 | 一航网络-软件测评官网 | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 深圳公司注册-工商注册公司-千百顺代理记账公司 | 微波萃取合成仪-电热消解器价格-北京安合美诚科学仪器有限公司 | 液压升降平台_剪叉式液压/导轨式升降机_传菜机定做「宁波日腾升降机厂家」 | 智能电表|预付费ic卡水电表|nb智能无线远传载波电表-福建百悦信息科技有限公司 | 石家庄小程序开发_小程序开发公司_APP开发_网站制作-石家庄乘航网络科技有限公司 | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | 清洁设备_洗地机/扫地机厂家_全自动洗地机_橙犀清洁设备官网 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | 干粉砂浆设备_干混砂浆生产线_腻子粉加工设备_石膏抹灰砂浆生产成套设备厂家_干粉混合设备_砂子烘干机--郑州铭将机械设备有限公司 | 北京发电车出租-发电机租赁公司-柴油发电机厂家 - 北京明旺盛安机电设备有限公司 | 中山市派格家具有限公司【官网】 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 氢氧化钾厂家直销批发-济南金昊化工有限公司 | 流变仪-热分析联用仪-热膨胀仪厂家-耐驰科学仪器商贸 | 桐城新闻网—桐城市融媒体中心主办| 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | 山东商品混凝土搅拌楼-环保型搅拌站-拌合站-分体仓-搅拌机厂家-天宇 | 浙江栓钉_焊钉_剪力钉厂家批发_杭州八建五金制造有限公司 | VI设计-LOGO设计公司-品牌设计公司-包装设计公司-导视设计-杭州易象设计 | 深圳富泰鑫五金_五金冲压件加工_五金配件加工_精密零件加工厂 | 净气型药品柜-试剂柜-无管道净气型通风柜-苏州毕恩思 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 压砖机_电动螺旋压力机_粉末成型压力机_郑州华隆机械tel_0371-60121717 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 真空冷冻干燥机_国产冻干机_冷冻干燥机_北京四环冻干 | 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 |