最近兩天一直在做如何從model中獲取數(shù)據(jù)庫(kù)中的數(shù)據(jù)憋活,然后把數(shù)據(jù)變成json數(shù)據(jù)傳給前臺(tái)洛心。
from roomhourse.models import v_xs
student = v_xs.object.all()
#<class 'django.db.model.query.QuerySet'>
return HttpResponse(student)
結(jié)果不出意外的出錯(cuò)了俊柔,傳的不是json埠况,而是QuerySet(查詢集)炕泳,
后來用了
import json
student = json.dumps(student,ensure_ascii=False)
return HttpResponse(student)
后來就開始報(bào)xxx ?is not JSON serializable之類的問題痴怨,這個(gè)主要原因還是因?yàn)槟悴樵兊膍odel里面可能有外鍵的原因忙干,在你查詢后,外鍵也在其中浪藻,但是外鍵其實(shí)也是一個(gè)查詢集捐迫,最簡(jiǎn)單的方法就是外鍵不要傳給前端,不過還是可以有更高端的方法爱葵,如下:
自己創(chuàng)建一個(gè)類施戴,繼承json,來添加自定義類的處理方法
class JsonXS(json.JSONENcoder):
? ? def default(self, obj):????????
? ? ? ? ? ? if isinstance(obj,v_xs):
? ? ? ? ? ? ? ? ? ? return? obj.__str__()
? ? ? ? ? ? return?json.JSONEncoder.default(self, obj)
student = json.dumps(student, cls= JsonXS,?ensure_ascii=False)
待定
或者用自定義轉(zhuǎn)json的方法
在models中:
def? JsonXS(self):
????????return {....'roomxs':self.roomxs,...}
在view中:
def? toDicts(objs):
? ? ? ? json_str = []
? ? ? ? for o in objs:
? ? ? ? ? ? ? ? json_str.append(o.JsonXS())
? ? ? ? return json_str
已測(cè)萌丈,可以執(zhí)行
或者直接導(dǎo)入了serializers
from django.core import serializers
studentman = serializers.serialize("json",studentman)
return HttpResponse(studentmanage)
已測(cè)赞哗,可以執(zhí)行
以上三個(gè)方法應(yīng)該都是可以傳json值的,我只測(cè)試了兩種方法辆雾,第一種沒有測(cè)試
*************************************************************************************************************************************************
其實(shí)python中json就有自帶的方法肪笋,json.dumps()
dumps是將dict轉(zhuǎn)化成str格式,loads是將str轉(zhuǎn)化成dict格式
參看連接:Django model,QuerySet 序列化成json的方法 - CSDN博客
? ? ? ? ? ? ? ? ? [Python]json 錯(cuò)誤xx is not JSON serializable - CSDN博客
? ? ? ? ? ? ? ? ??Django發(fā)送Json格式數(shù)據(jù) - CSDN博客