1. 程式人生 > 實用技巧 >python測試開發django(13)--查詢結果轉json(serializers)

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),訪問後得到的結果如下;