目錄結構
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即可。