山東有哪些網(wǎng)絡(luò)公司優(yōu)化大師客服
目錄
遇到問題
Django返回json結(jié)構(gòu)報文
不可行方式python json
可行方式JsonResponse+QuerySet.values()。
python的兩個web框架,flask和django,兩者都具有view 模板的章節(jié),但是當前開發(fā)一個應(yīng)用,大部分采用前后端分離的合作方式。因此必然面對的一個事情就是接口返回json格式的數(shù)據(jù)報文。本文就是針對這個事情進行了闡述,遵從了從問題產(chǎn)生到方案選擇的過程。
遇到問題
如下為使用Django的序列化器得到的json格式數(shù)據(jù),可以很明顯的發(fā)現(xiàn),這個格式和理想的fieldName:fieldData形式存在較大的差異。
serializers.serialize('json', instance)[{"model": "polls.question",
"pk": 1,
"fields": {"question_text": "xxxxxxxxxxx?","pub_date": "2023-07-25T07:05:08Z"}
}, {"model": "polls.question",
"pk": 2,
"fields": {"question_text": "啊啊啊啊啊","pub_date": "2023-07-27T02:00:59Z"}
}]
Django返回json結(jié)構(gòu)報文
通過這個問題,引出了本文要做的事情,在Django接口中,如何將數(shù)據(jù)模型實例轉(zhuǎn)換為常規(guī)的json格式并返回。
不可行方式python json
dumps會出現(xiàn)序列化異常,Object of type xxxxx is not JSON serializable。
可行方式JsonResponse+QuerySet.values()。
values()返回由一系列字典實例構(gòu)成的QuerySet。下面對比下使用和不使用values()得到的QuerySet有什么區(qū)別。
# 由模型對象構(gòu)成.
>>> Blog.objects.filter(name__startswith="Beatles")
<QuerySet [<Blog: Beatles Blog>]># 由字典構(gòu)成.
>>> Blog.objects.filter(name__startswith="Beatles").values()
<QuerySet [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]>
JsonResponse作為HttpResponse的子類,對返回數(shù)據(jù)進行json編碼。
接下來是簡單代碼樣例
定義一個APIResult class:
class APIResult(dict):
def __init__(self, data):
self['code'] = 200
if isinstance(data, dict):print("data is dict")
self['data'] = data
elif isinstance(data, list):print("data is list")
self['data'] = dataelse:print("data is not dict or list")
self['data'] = list(data)
返回模型實例列表:
def question_list(request):
query_set = Question.objects.all()[:5]
result = APIResult(data=query_set.values())
return JsonResponse(result, safe=False){"code": 200,
"data": [{"id": 1,"question_text": "xxxxxxxxxxx?","pub_date": "2023-07-25T07:05:08Z"}, {"id": 2,"question_text": "\u554a\u554a\u554a\u554a\u554a","pub_date": "2023-07-27T02:00:59Z"}]
}
返回具體實例:
def question_detail(request, question_id):try:
query_set = Question.objects.filter(pk=question_id)
except Question.DoesNotExist:
raise Http404("No question") result = APIResult(data=query_set.values()[0])
return JsonResponse(result){"code": 200,
"data": {"id": 1,"question_text": "xxxxxxxxxxx?","pub_date": "2023-07-25T07:05:08Z"}
}
如果你對返回哪些字段有要求,可以向values()傳入具體字段名,如values('id')。
{"code": 200, "data": [{"id": 1}, {"id": 2}]}