有些時(shí)候我們需要將Django從數(shù)據(jù)庫獲取的數(shù)據(jù)以json的格式傳輸?shù)角岸耍热鏴charts圖表用到的就是json格式的數(shù)據(jù)腰懂。關(guān)于Django對象序列化成json逞带,筆者踩了一些坑,最終總結(jié)了直觀簡潔地兩種方法愧捕。
一肃续、使用Django自帶的serializers序列化
Django ORM的 Queryset對象默認(rèn)無法被直接json.dumps()序列化黍檩,django.core提供的serializers模塊可以將其序列化成str類型。
例如始锚,在views.py里的代碼如下:
def tabledata(request):
mon = MonRota.objects.all().filter(s_time__startswith='2018-02-10')
json_data = serializers.serialize('json', mon)
json_data = json.loads(json_data)
return JsonResponse(json_data, safe=False)
接收到的json數(shù)據(jù):
[{
"model": "ops.monrota",
"pk": "1000001",
"fields":
{
"s_time": "2018-02-10T09:00:00Z",
"e_time": "2018-02-10T20:29:59Z",
"name": "Mayun",
}
},
{
"model": "ops.monrota",
"pk": "1000002",
"fields":
{
"s_time": "2018-02-10T20:30:00Z",
"e_time": "2018-02-11T09:59:59Z",
"name": "MaHuateng",
}
}]
可以看到比較詳細(xì)的信息刽酱,例如model名、主鍵數(shù)據(jù)瞧捌。
二棵里、使用json模塊中的json.dumps()函數(shù)序列化
或許方法一中的json格式并不是你想要的,我們大多數(shù)情況需要的都是類似于[{},{}]的二維格式姐呐,這時(shí)候我們可以用json.dumps()函數(shù)來處理殿怜。
def tabledata(request):
mon = MonRota.objects.all().filter(s_time__startswith='2018-02-10').values()
json_data = list(mon)
json_data = json.dumps(json_data, cls=DateEncoder, ensure_ascii=False)
return HttpResponse(json_data)
這里我們做了兩個(gè)指定,cls=DateEncoder
和ensure_ascii=False
曙砂,有兩個(gè)方面的考慮头谜。
一個(gè)是解決datetime、date格式數(shù)據(jù)無法json序列化問題鸠澈,新定義了一個(gè)類DateEncoder()
去處理柱告。
class DateEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, datetime.date):
return obj.strftime("%Y-%m-%d")
else:
return json.JSONEncoder.default(self, obj)
另外,json.dumps() 序列化時(shí)對中文默認(rèn)使用的ascii編碼笑陈,想輸出真正的中文需要指定ensure_ascii=False
际度。
接收到的json數(shù)據(jù):
[{
"id": "1000001",
"s_time": "2018-02-10T09:00:00Z",
"e_time": "2018-02-10T20:29:59Z",
"name": "Mayun",
},
{
"id": "1000002",
"s_time": "2018-02-10T20:30:00Z",
"e_time": "2018-02-11T09:59:59Z",
"name": "MaHuateng",
}]
當(dāng)然,網(wǎng)絡(luò)上還有序列化成json的其他方法涵妥,大家也可以參考乖菱,但是個(gè)人推薦以上兩種,信我少踩坑妹笆。
如果你喜歡本文章块请,還請點(diǎn)個(gè)關(guān)注和喜歡,我會(huì)為大家不斷地帶來Python學(xué)習(xí)筆記拳缠。