django學習-16.返回給前端頁面數據爲json數據類型的3種方案

目錄結構

1.前言

2.JsonResponse類的源碼簡單分析

3.【方案1:使用方法serializers】的具體方案實現流程

4.【方案2:使用方法model_to_dict】的具體方案實現流程

5.【方案3:使用方法value跟方法list結合】的具體方案實現流程

 

 

1.前言

django的ORM框架提供的查詢數據庫表數據的方法很多,不同的方法返回的結果也不太一樣,不同方法都有各自對應的使用場景。

主要常用的查詢方法個數是13個,方法返回值是可迭代對象QuerySet的方法只有這8個:all(),filter(),exclude(),order_by(),reverse(),values(),values_list(),distinct();

如果前端人員要求接口返回值的數據類型是json,後端人員要對接口返回值爲可迭代對象QuerySet的值通過其他方法間接轉成非可迭代對象和非json的數據類型的值並把該值當成JsonResponse類初始化時的其中一個入參data的值,最終把JsonResponse類初始化後的對象當做最終的接口返回值提供給前端人員

把接口返回值爲可迭代對象QuerySet的值通過其他方法間接轉成json的數據類型的值的所謂方案,目前只有這3種方案(我們只需要記住這3種即可):

⑴.方案1:使用方法serializers                                                 

     主要作用:把接口返回值爲可迭代對象QuerySet的值轉爲json的數據類型(即轉爲python語言裏的數據類型爲字符串的數據類型)的值;

    (這種方案只需要做了解即可,基本用不到)

⑵.方案2:使用方法model_to_dict                                           

     主要作用:把接口返回值爲可迭代對象QuerySet的值轉爲python語言裏的數據類型爲dict的數據類型的值;

    (這種方案只需要做了解即可,基本用不到)

⑶.方案3:使用方法value跟方法list結合                         

     主要作用:把接口返回值爲可迭代對象QuerySet的值轉爲python語言裏的數據類型爲list的數據類型的值;

    (這種方案最簡單,基本都會用這個,要重點知道怎麼用)

 

細節:

①.問題:爲什麼視圖函數返回值返回給前端頁面的數據的數據類型有時需要爲json?

大概答案:

目前大多數公司研發團隊都是採取前後端分離進行項目開發,可以大大提高項目開發效率和提高維護效率。

所以前端開發人員一般會要求後端開發人員把接口返回值轉成數據類型爲json的數據傳給前端開發人員,前端開發人員拿到該數據類型爲json的數據後再單獨進行處理並獲取到自己想要的字段數據去進行對應html頁面的數據加載渲染。

②.問題:json這個數據類型要怎麼理解?

大概答案:

json這個數據類型,其實數據類型就是字符串。

json這個數據類型可以理解爲是美元,全世界的每個國家都可以通過美元進行交易。

而python提供的任何數據類型都可以理解爲人民幣,java提供的任何數據類型都可以理解爲歐元,php提供的任何數據類型都可以理解爲日元,c語言提供的任何數據類型都可以理解爲港幣,html需要的數據類型必須只能爲json。

所以,無論是哪種後端語言編寫的接口返回值,如果前端人員要求接口返回值的數據類型是json,後端人員要對接口返回值做數據類型的轉化即把原先的數據類型(比如python語言的list數據類型/dict數據類型)轉成json的數據類型後才能當成最終的接口返回值。

 

2.JsonResponse類的源碼簡單分析

細節:

①.json是目前常用的一種數據格式,有時候我們後端開發人員需要給前端開發人員返回一個json格式的數據,而JsonResponse類就能滿足這樣的需求。

②.通過【from django.http import JsonResponse】和【class JsonResponse(HttpResponse)】,我們可以知道JsonResponse類它是HttpResponse的的一個子類,從父類繼承大部分行爲,用來幫助創建json的響應。

2.1.JsonResponse類的源碼如下所示

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)

2.2.JsonResponse類的構造函數裏的每個入參的大概含義和作用

①.入參【data】:應該傳遞一個數據類型爲dict的值給它(也可以不傳一個數據類型爲dict的值給它),它將其轉換成 json 格式的數據。   

②.入參【encoder】:默認值爲django.core.serializers.json.DjangoJSONEncoder或DjangoJSONEncoder,用於序列化data。(關於序列化的更多知識點可以百度搜索json序列化進行學習,目前只需要瞭解要這麼用即可)   

③.入參【safe】 : 默認值爲True。如果值設置爲False,表示可以傳遞任何對象(比如list/tuple/dict)進行序列化;如果值設置爲True,而第一個參數data的值不是dict對象,將拋出一個TypeError。 

④.入參【json_dumps_params】:默認值爲None。在django1.9版本中新增的入參,可以傳遞一個python裏的json庫裏的json.dump() 方法處理後的對象給該入參當入參值,用於生成一個響應。(瞭解即可)

 

3.【方案1:使用方法serializers】的具體方案實現流程

3.1.第一步:先編寫相關代碼內容的視圖函數

3.2.第二步:在任一瀏覽器訪問該網址【http://127.0.0.1:8000/search_person_data/】,查看結果頁面的數據展示

 3.3.第三步:可以把接口返回值拿到該網站【https://www.json.cn/】進行解析和格式化,便於直觀查看

3.4.第四步:查看打印的日誌信息,看是否符合預期結果

 

4.【方案2:使用方法model_to_dict 】的具體方案實現流程

4.1.第一步:先編寫相關代碼內容的視圖函數

 

 

4.2.第二步:在任一瀏覽器訪問該網址【http://127.0.0.1:8000/search_person_data/】,查看結果頁面的數據展示

 

 

4.3.第三步:查看打印的日誌信息,看是否符合預期結果

 

5.【方案3:使用方法value跟方法list結合】的具體方案實現流程

5.1.第一步:先編寫相關代碼內容的視圖函數

5.2.第二步:在任一瀏覽器訪問該網址【http://127.0.0.1:8000/search_person_data/】,查看結果頁面的數據展示

5.3.第三步:查看打印的日誌信息,看是否符合預期結果

 

細節:

①.【方案3:使用方法value()跟方法list結合】是主流常用的方案,後續我們進行平臺開發時儘量選擇這個方案3即可。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章