日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Django 再談一談json序列化

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

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

比如,我們通過ORM從數據庫查詢出的結果,試圖通過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

報錯,QuerySet不是JSON能序列化的對象。那么有什么辦法可以解決呢?

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

方法一: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)

將返回的結果放到bejson校驗結果如下:

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

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

觀察序列化結果,發現這種方式將服務端數據庫的表名都暴露了;另外serializers不支持連表序列化,只能拿到另一張表的id。下面我們我們用一種新的方式。

方法二:自定義JSON處理器

查看json.dumps源碼,發現序列化時,用到了一個參數cls = JSONEncoder,我們可以繼承它,自定義一個類,重寫它的default方法,來處理我們需要的數據類型。比如自定義對時間對象進行轉化:

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)

下面我們試著序列化一個datetime對象:

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序列化

補充知識:Django ORM對象Json序列化問題

碰到了一個問題:在使用json.dumps()序列化Django ORM的Queryset對象,傳遞給前端的時候,程序報錯:

Object of type ’QuerySet’ is not JSON serializable

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

經過一番度娘搜索,發現有如下解決方案:

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

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

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

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

json默認只支持python原生的list、tuple、dict數據類型對象的序列化,若需要擴展其他類型對象的序列化功能,可以這樣修改:

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’>#在序列化時指定cls參數,cls=自定義的序列化類,在自定義序列化類的default方法中判斷,如果是指定的類的實例的話,則將該類轉換成dict格式返回,若指定類的實例,則使用json模塊默認的序列化方法。最終得到的return值為str類型。

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

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
婷婷成人基地| 日本va欧美va精品发布| 韩国精品主播一区二区在线观看| **爰片久久毛片| 国产麻豆精品久久| 日韩成人a**站| 免费视频亚洲| 日韩一区二区三区在线看| 国产精品麻豆成人av电影艾秋 | 日韩精品福利一区二区三区| 日韩欧美中文字幕电影| 精品国产美女a久久9999| 激情视频一区二区三区| 日本成人在线一区| 91综合网人人| 日韩中文字幕区一区有砖一区 | 国产麻豆精品| 精品99在线| 成人久久久久| 日本大胆欧美人术艺术动态| 国产亚洲精品美女久久| 天堂中文在线播放| 日韩制服丝袜先锋影音| 久久精品国产福利| 亚洲激情五月| 欧美日韩一区二区三区不卡视频| 每日更新成人在线视频| 日韩1区2区日韩1区2区| 91综合网人人| 蜜桃视频免费观看一区| 狠狠久久伊人| 亚洲欧美日本日韩| 麻豆一区在线| 日韩精品一二三| 欧美男人天堂| 日韩二区三区在线观看| 久久精品成人| 国产精品黄色片| 麻豆亚洲精品| 日本欧美不卡| 欧美永久精品| 一本色道久久精品| 国产91在线精品| 亚洲精品成人一区| 久久久久一区| 国产精品高清一区二区| 日韩中文字幕一区二区三区| 日韩精品看片| 卡一卡二国产精品| 亚洲精品乱码日韩| 欧美.日韩.国产.一区.二区 | 亚洲精品进入| 激情国产在线| 日本不卡的三区四区五区| 久久蜜桃av| 国产精品一区二区三区www| 丝袜亚洲另类欧美| 成人精品中文字幕| 精品亚洲成人| 久久精品97| 男人操女人的视频在线观看欧美| 亚洲一区有码| 亚洲h色精品| 国产一区二区三区精品在线观看| 国产精品久久久久久久久妇女| 麻豆精品视频在线观看免费| 亚洲色诱最新| 亚洲高清久久| 中文字幕色婷婷在线视频| 国产麻豆一区二区三区精品视频| 美女毛片一区二区三区四区最新中文字幕亚洲 | 麻豆成人av在线| 一级欧美视频| 亚洲欧美日韩国产综合精品二区| 亚洲一二三区视频| 99精品电影| 日韩综合在线| 欧美精品成人| 欧美日韩亚洲一区在线观看| 蜜臀a∨国产成人精品| 久久不射中文字幕| 欧美日韩四区| 午夜国产欧美理论在线播放| 久久久人人人| 国产精品久久久久av电视剧| 日韩88av| 理论片午夜视频在线观看| 精品美女在线视频| 久久狠狠久久| 欧美日韩中出| 国产精品白丝久久av网站| 国产精品综合色区在线观看| 日韩国产在线观看| 亚洲精品一级| 青草国产精品| 国产区精品区| 国产精东传媒成人av电影| 国产精品蜜月aⅴ在线| 国产精品一在线观看| 国产精品观看| 国产91在线播放精品| 国产在线观看www| 韩国三级一区| 欧美日韩少妇| 最近国产精品视频| 日韩精品第二页| 国产亚洲欧美日韩在线观看一区二区 | 日韩一区二区三区精品视频第3页 日韩一区二区三区免费视频 | 欧美精品一二| 九九久久电影| 免费视频最近日韩| 日韩欧美在线精品| 国产日本久久| 国产乱码精品一区二区亚洲| 里番精品3d一二三区| 亚洲天堂av影院| 99久久亚洲精品蜜臀| 久久亚洲精品中文字幕蜜潮电影| 亚洲精品观看| 日韩精品三级| 欧美激情日韩| 国产精品99视频| 欧洲一区二区三区精品| 欧美日韩尤物久久| 一区二区亚洲精品| 亚洲精品伦理| 久久精品国产一区二区| 日韩欧美一区二区三区免费看| 欧美一级网址| 麻豆精品av| 亚洲一级影院| 视频国产精品| 久久精品国产免费| 久久中文亚洲字幕| 综合一区二区三区| 精品久久99| 激情五月综合| 日韩福利视频导航| 91欧美国产| 久久亚洲不卡| 麻豆免费精品视频| 久久久人人人| 亚洲人成高清| 国产不卡精品| 美女精品网站| 国内精品亚洲| 伊人影院久久| 欧美天堂在线| 欧美午夜精品一区二区三区电影| 日韩av二区| 国产精品视区| 国产精品日韩精品中文字幕| 日本免费一区二区三区四区| 蜜臀av一区二区在线免费观看| 亚洲激情五月| 国产日韩欧美一区在线| 久久久一二三| 国产日韩一区二区三区在线| 日韩精品dvd| 综合一区av| 久久久一本精品| 69堂免费精品视频在线播放| 日韩精品91| 久久精品av麻豆的观看方式| 激情久久五月| 国产精品99久久免费观看| 亚洲v在线看| 国产精品免费不| 亚洲女人av| www.com.cn成人| 久久国内精品自在自线400部| 久久精品99国产精品日本| 成人午夜精品| 国产欧美在线| 国产精品日本欧美一区二区三区| aa亚洲婷婷| 久久女人天堂| 免费不卡在线视频| 波多野结衣久久精品| 亚洲影视一区| 久久一区二区三区电影| 国产精品sss在线观看av| 美女尤物久久精品| 欧美国产一级| 国产精品一区免费在线| 在线综合亚洲| 欧美日韩视频免费观看| 欧美a一区二区| 亚洲精品看片| 99国产精品私拍| 蜜桃成人精品| 美女久久久久久 | 日韩午夜视频在线| 美女久久99| 少妇高潮一区二区三区99| 激情久久五月| 蜜臀久久精品| 麻豆成人综合网| 久久精品97| 亚洲18在线|