日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django,再谈json序列化

發布時間:2025/3/17 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django,再谈json序列化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

比如,我們通過ORM從數據庫查詢出的結果,試圖通過json序列化:

from .models import UserInfodef index(request):user_list = UserInfo.objects.all()import jsonreturn 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 serializersuser_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 json from datetime import date from 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 jsonreturn HttpResponse(json.dumps(now, cls=JsonCustomEncoder))

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

是不是成功處理了呢

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的Django,再谈json序列化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。