色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

Django 再談一談json序列化

瀏覽:58日期:2024-05-28 18:33:30

我們知道JSON字符串是目前流行的數(shù)據(jù)交換格式,在pyhton中我們通過json模塊,將常用的數(shù)據(jù)類型轉(zhuǎn)化為json字符串。但是,json支持轉(zhuǎn)化的數(shù)據(jù)類型是有限的。

比如,我們通過ORM從數(shù)據(jù)庫查詢出的結(jié)果,試圖通過json序列化:

from .models import UserInfodef index(request): user_list = UserInfo.objects.all() import json return HttpResponse(json.dumps(user_list)) # TypeError: Object of type ’QuerySet’ is not JSON serializable

報(bào)錯(cuò),QuerySet不是JSON能序列化的對(duì)象。那么有什么辦法可以解決呢?

注意,如果是通過values查詢,如UserInfo.objects.values('name'),查詢出來的結(jié)果雖然也是QuerySet對(duì)象,但是其結(jié)構(gòu)是這樣的:<QuerySet [{’name’: ’egon’}, {’name’: ’sb’}]>, 類似于列表套字典的結(jié)構(gòu)。對(duì)于這種情況,我們可以通過list()方法將QuerySet 對(duì)象轉(zhuǎn)化為列表,這樣就可以直接用json.dumps()進(jìn)行序列化了。

方法一:serializers

def index(request): user_list = UserInfo.objects.all() from django.core import serializers user_list_json = serializers.serialize('json', user_list) return HttpResponse(user_list_json)

將返回的結(jié)果放到bejson校驗(yàn)結(jié)果如下:

[ { 'model': 'app01.userinfo', 'pk': 1, 'fields': { 'name': 'egon', 'pwd': '123' }},{ 'model': 'app01.userinfo', 'pk': 2, 'fields': { 'name': 'sb', 'pwd': '123' }}]

注:pk代表主鍵(可以是默認(rèn)的id主鍵字段,也可以是用戶自定義的主鍵字段)

觀察序列化結(jié)果,發(fā)現(xiàn)這種方式將服務(wù)端數(shù)據(jù)庫的表名都暴露了;另外serializers不支持連表序列化,只能拿到另一張表的id。下面我們我們用一種新的方式。

方法二:自定義JSON處理器

查看json.dumps源碼,發(fā)現(xiàn)序列化時(shí),用到了一個(gè)參數(shù)cls = JSONEncoder,我們可以繼承它,自定義一個(gè)類,重寫它的default方法,來處理我們需要的數(shù)據(jù)類型。比如自定義對(duì)時(shí)間對(duì)象進(jìn)行轉(zhuǎn)化:

import jsonfrom datetime import datefrom datetime import datetimeclass 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’) else: return json.JSONEncoder.default(self, field)

下面我們?cè)囍蛄谢粋€(gè)datetime對(duì)象:

def index(request): now = datetime.now() import json return HttpResponse(json.dumps(now, cls=JsonCustomEncoder))

再次訪問http://127.0.0.1:8000/index.html:

Django 再談一談json序列化

補(bǔ)充知識(shí):Django ORM對(duì)象Json序列化問題

碰到了一個(gè)問題:在使用json.dumps()序列化Django ORM的Queryset對(duì)象,傳遞給前端的時(shí)候,程序報(bào)錯(cuò):

Object of type ’QuerySet’ is not JSON serializable

在python 中,常用的json 的序列化是從simplejson 基礎(chǔ)上改變而來。這個(gè)json 包主要提供了dump,load 來實(shí)現(xiàn)dict 與 字符串之間的序列化與反序列化,這很方便的可以完成,但現(xiàn)在的問題是,這個(gè)json包不能序列化 django 的models 里面的對(duì)象的實(shí)例。

經(jīng)過一番度娘搜索,發(fā)現(xiàn)有如下解決方案:

使用django.core自帶的serializers模塊:

#django ORM的 Queryset對(duì)象默認(rèn)無法被直接json.dumps()序列化,django.core提供的serializers模塊提供將其序列化成str類型#的功能,serializers處理后,再次json.dumps傳給前端,前端需要經(jīng)過兩次json.Parse()處理,才能得到原對(duì)象類型,但是格式發(fā)#生了變化,需要按新的方式取索引.例如:obj[’pk’]取主鍵,obj[’fields’]['caption']取obj的caption字段由QuerySet:[<Business: Business object>]變?yōu)榱耍篬{'model': 'cmdb.business', 'pk': 1, 'fields': {'caption': 'develop'}}]

這樣前端就可以正常獲取數(shù)據(jù)了,只不過此字段需要兩次json.Parse()處理。

至于使用models.Host.objects.get(id=xx)的方式獲取到單個(gè)對(duì)象,而非Queryset對(duì)象,serializers默認(rèn)也無法處理的問題,可以自定義json方法來實(shí)現(xiàn)dumps序列化

json默認(rèn)只支持python原生的list、tuple、dict數(shù)據(jù)類型對(duì)象的序列化,若需要擴(kuò)展其他類型對(duì)象的序列化功能,可以這樣修改:

import json as default_jsonfrom json.encoder import JSONEncoderclass BaseResponse(object): def __init__(self): self.status = True self.message = None self.data = None self.error = Noneo=BaseResponse()class JsonCustomEncoder(JSONEncoder): def default(self, o): if isinstance(o, BaseResponse): return o.__dict__ return JSONEncoder.default(self, o)o1=json.dumps(o,cls=JsonCustomEncoder)>>> print(o1){'message': null, 'error': null, 'data': null, 'status': true}>>> print(type(o1))<class ’str’>#在序列化時(shí)指定cls參數(shù),cls=自定義的序列化類,在自定義序列化類的default方法中判斷,如果是指定的類的實(shí)例的話,則將該類轉(zhuǎn)換成dict格式返回,若指定類的實(shí)例,則使用json模塊默認(rèn)的序列化方法。最終得到的return值為str類型。

以上這篇Django 再談一談json序列化就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 亚洲第一激情 | 欧美久草在线 | 国产在线拍揄自揄视精品不卡 | 欧美一级特黄一片免费 | 亚洲欧美卡通动漫丝袜美腿 | 碰碰人人| 国产成人高清在线观看播放 | 欧美一级毛片黄 | 欧美久久一区二区 | 久久精品大片 | 久久99久久99精品 | 久久久久久综合对白国产 | 天堂在线www网亚洲 天堂在线视频网站 | 老司机免费福利午夜入口ae58 | 久久99精品这里精品3 | 国产精品成人观看视频国产 | 亚洲精品第一区二区三区 | 欧美一级aⅴ毛片 | 中文字幕在线视频网站 | 日韩精品视频免费在线观看 | www一级片| 免费一级在线 | 欧美三级久久 | 日本色哟哟 | 乱码一区 | 手机在线看片国产日韩生活片 | 精品视频一区二区 | 特黄特色三级在线观看 | 欧美人成在线观看 | 欧美国产精品 | 欧美白人和黑人xxxx猛交视频 | 久久精品国产免费中文 | 国产成人lu在线视频 | 国产精品视频九九九 | 亚洲aⅴ男人的天堂在线观看 | 欧美一级成人毛片影院 | 青青久草| 成人影院久久久久久影院 | 一区二区三区影视 | 91精品国产欧美一区二区 | 日韩欧美国产视频 |