python測試開發django(13)--查詢結果轉json(serializers)
前言
django查詢資料庫返回的是可迭代的queryset序列,如果不太習慣這種資料的話,可以用serializers方法轉成json資料,更直觀
返回json資料,需要用到JsonResponse。django查詢資料庫返回json資料有3種方法
- serializers轉json
- model_to_dict轉字典
- values() 轉list(最簡單,推薦!)
JsonResponse
json是目前常用的一種資料格式,有時候我們需要返回一個json格式的資料,而JsonResponse提供了一個快捷的方法。
它是HttpResponse的一個子類,用來幫助使用者建立JSON編碼的響應。它從父類繼承大部分行為,下面是建構函式:
class JsonResponse(HttpResponse): """ An HTTP response class that consumes data to be serialized to JSON. :param data: Data to be dumped into json. By default only ``dict`` objects are allowed to be passed due to a security flaw before EcmaScript 5. See the ``safe`` parameter for more information. :param encoder: Should be a json encoder class. Defaults to ``django.core.serializers.json.DjangoJSONEncoder``. :param safe: Controls if only ``dict`` objects may be serialized. Defaults to ``True``. :param json_dumps_params: A dictionary of kwargs passed to json.dumps(). """ def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs): if safe and not isinstance(data, dict): raise TypeError( 'In order to allow non-dict objects to be serialized set the ' 'safe parameter to False.' ) if json_dumps_params is None: json_dumps_params = {} kwargs.setdefault('content_type', 'application/json') data = json.dumps(data, cls=encoder, **json_dumps_params) super().__init__(content=data, **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()方法處理後的物件給它,用於生成一個響應。
用法:
這一篇的project和app都是重新建立的,專案結果如下圖;
serializers 轉 json
django裡面有個serializers方法可以,直接把查詢的結果轉成json資料
接著上一篇查詢Users表裡面的所有資料,用all()方法
serializers方法需要先從django.core模組匯入
# coding:utf-8 #cld/cld/dbtest.py from django.http import HttpResponse,JsonResponse from tb.models import Users from django.core import serializers import json def get_json(request): datas={} a=Users.objects.all() datas['result']=json.loads(serializers.serialize("json",a)) return JsonResponse(datas)
在urls.py配置訪問地址
url('^getj$',dbtest.get_json),訪問後得到的結果
model_to_dict轉字典
上面的serializers方法雖然可以直接轉成json資料,但是上面返回的結果裡面有一些多餘的欄位model和pk,不是我們想要的。
接下來介紹第二種方法使用model_to_dict方法把查詢的queryset序列結果轉成字典序列
# coding:utf-8 #cld/cld/dbtest.py from django.http import HttpResponse,JsonResponse from tb.models import Users from django.core import serializers import json from django.forms.models import model_to_dict def to_dicts(request): r=Users.objects.all() json_lists=[] for i in r: json_dict=model_to_dict(i) json_lists.append(json_dict) return JsonResponse(json_lists,safe=False)
在urls.py配置訪問地址
url('^to$',dbtest.to_dicts),訪問後得到的結果
values() 轉list
第三種方法不需要匯入方法,先用values方法獲取一個可迭代的dict序列,再用list函式轉成list物件
# coding:utf-8 #cld/cld/dbtest.py from django.http import HttpResponse,JsonResponse from tb.models import Users from django.core import serializers import json from django.forms.models import model_to_dict def json_data(request): datas={} r=Users.objects.all().values() datas["data"]=list(r) return JsonResponse(datas,safe=False)
在urls.py配置訪問地址
url('^jd$',dbtest.json_data),訪問後得到的結果如下;