django查詢數據庫返回的是可迭代的queryset序列,若是不太習慣這種數據的話,能夠用serializers方法轉成json數據,更直觀
返回json數據,須要用到JsonResponse。django查詢數據庫返回json數據有3種方法html
json是目前經常使用的一種數據格式,有時候咱們須要返回一個json格式的數據,而 JsonResponse 提供了一個快捷的方法。python
它是 HttpResponse 的一個子類,用來幫助用戶建立JSON 編碼的響應。它從父類繼承大部分行爲,下面看起構造函數:數據庫
class JsonResponse(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs) data: 應該傳遞一個標準的 python 字典給它,它將其轉換成 json 格式的數據。 encoder:默認爲 django.core.serializers.json.DjangoJSONEncoder,用於序列化data。關於這個序列化的更多信息參見JSON 序列化。 safe : 默認爲True。若是設置爲False,能夠傳遞任何對象進行序列化(不然,只容許dict 實例)。若是safe 爲True,而第一個參數傳遞的不是dict 對象,將拋出一個TypeError。 另外:它的默認 Content-Type 頭部設置爲application/json。 json_dumps_params:在1.9版本中新增,能夠傳遞一個python標準的 json 庫中,json.dump() 方法處理後的對象給它,用於生成一個響應。
用法django
>>> from django.http import JsonResponse >>> response = JsonResponse({'foo': 'bar'}) >>> response.content '{"foo": "bar"}'
django裏面有個serializers方法能夠,直接把查詢的結果轉成json數據
接着上一篇查詢User表裏面的因此數據,用all()方法json
serializers方法須要先從django.core模塊導入app
# helloworld/helloworld/testdb.py from django.http import HttpResponse, JsonResponse from hello.models import User from django.core import serializers import json def get_json(request): '''返回json數據''' data = {} a = User.objects.all() data['result'] = json.loads(serializers.serialize("json", a)) return JsonResponse(data)
在urls.py配置訪問地址 url(r'^get_json$', testdb.get_json,訪問後獲得的結果(返回的數據本身在線解析過)函數
{ "result": [{ "model": "hello.user", "pk": "yoyo", "fields": { "psw": "123456", "mail": "283340479@qq.com" } }, { "model": "hello.user", "pk": "yoyo2", "fields": { "psw": "111111", "mail": "1" } }, { "model": "hello.user", "pk": "yoyo5", "fields": { "psw": "111111", "mail": "0" } } ] }
上面的serializers方法雖然能夠直接轉成json數據,可是上面返回的結果裏面有一些多餘的字段model和pk,不是咱們想要的。
接下來介紹第二種方法使用model_to_dict方法把查詢的queryset序列結果轉成字典序列測試
# helloworld/helloworld/testdb.py from django.http import HttpResponse, JsonResponse from hello.models import User from django.core import serializers import json from django.forms.models import model_to_dict def to_dict(request): '''把返回的結果轉成dict序列''' ret = User.objects.all() json_list = [] for i in ret: json_dict = model_to_dict(i) json_list.append(json_dict) return JsonResponse(json_list, safe=False)
在urls.py配置訪問地址 url(r'^to_dict$', testdb.to_dict,訪問後獲得的結果(返回的數據本身在線解析過)編碼
[{ "user_name": "yoyo", "psw": "123456", "mail": "283340479@qq.com" }, { "user_name": "yoyo2", "psw": "111111", "mail": "1" }, { "user_name": "yoyo5", "psw": "111111", "mail": "0" }]
第三種方法不須要導入方法,先用values方法獲取一個可迭代的dict序列,再用list函數轉成list對象url
# helloworld/helloworld/testdb.py from django.http import HttpResponse, JsonResponse from hello.models import User from django.forms.models import model_to_dict def json_data(request): '''values()獲取的可迭代dict對象轉list''' data = {} ret = User.objects.all().values() data["data"] = list(ret) return JsonResponse(data, safe=False)
在urls.py配置訪問地址 url(r'^json_data$', testdb.json_data,訪問後獲得的結果(返回的數據本身在線解析過)
{ "data": [{ "user_name": "yoyo", "psw": "123456", "mail": "283340479@qq.com" }, { "user_name": "yoyo2", "psw": "111111", "mail": "1" }, { "user_name": "yoyo5", "psw": "111111", "mail": "0" }] }
關於中文顯示問題參考這篇【python測試開發django-16.JsonResponse返回中文編碼問題】
django交流QQ羣:779429633