django 明確REST介面開發的核心任務
明確REST介面開發的核心任務
分析一下上節的案例,可以發現,在開發REST API介面時,檢視中做的最主要有三件事:
- 將請求的資料(如JSON格式)轉換為模型類物件
- 操作資料庫
- 將模型類物件轉換為響應的資料(如JSON格式)
序列化Serialization
維基百科中對於序列化的定義:
序列化(serialization)在電腦科學的資料處理中,是指將資料結構或物件狀態轉換成可取用格式(例如存成檔案,存於緩衝,或經由網路中傳送),以留待後續在相同或另一臺計算機環境中,能恢復原先狀態的過程。依照序列化格式重新獲取位元組的結果時,可以利用它來產生與原始物件相同語義的副本。對於許多物件,像是使用大量參照的複雜物件,這種序列化重建的過程並不容易。面向物件中的物件序列化,並不概括之前原始物件所關聯的函式。這種過程也稱為物件編組(marshalling)。從一系列位元組提取資料結構的反向操作,是反序列化(也稱為解編組, deserialization, unmarshalling)。
序列化在電腦科學中通常有以下定義:
在資料儲存與傳送的部分是指將一個物件)儲存至一個儲存媒介,例如檔案或是記億體緩衝等,或者透過網路傳送資料時進行編碼的過程,可以是位元組或是XML等格式。而位元組的或XML編碼格式可以還原完全相等的物件)。這程式被應用在不同應用程式之間傳送物件),以及伺服器將物件)儲存到檔案或資料庫。相反的過程又稱為反序列化。
簡而言之,我們可以將序列化理解為:
將程式中的一個數據結構型別轉換為其他格式(字典、JSON、XML等),例如將Django中的模型類物件裝換為JSON字串,這個轉換過程我們稱為序列化。
如:
queryset = BookInfo.objects.all() book_list = [] # 序列化 for book in queryset: book_list.append({ 'id': book.id, 'btitle': book.btitle, 'bpub_date': book.bpub_date, 'bread': book.bread, 'bcomment': book.bcomment, 'image': book.image.url if book.image else '' }) return JsonResponse(book_list, safe=False)
反之,將其他格式(字典、JSON、XML等)轉換為程式中的資料,例如將JSON字串轉換為Django中的模型類物件,這個過程我們稱為反序列化。
如:
json_bytes = request.body json_str = json_bytes.decode() # 反序列化 book_dict = json.loads(json_str) book = BookInfo.objects.create( btitle=book_dict.get('btitle'), bpub_date=datetime.strptime(book_dict.get('bpub_date'), '%Y-%m-%d').date() )
我們可以看到,在開發REST API時,檢視中要頻繁的進行序列化與反序列化的編寫。
總結
在開發REST API介面時,我們在檢視中需要做的最核心的事是:
-
將資料庫資料序列化為前端所需要的格式,並返回;
-
將前端傳送的資料反序列化為模型類物件,並儲存到資料庫中。