1. 程式人生 > >Serializers 序列化元件 Serializers 序列化元件

Serializers 序列化元件 Serializers 序列化元件

Serializers 序列化元件

 

為什麼要用序列化元件

當我們做前後端分離的專案~~我們前後端互動一般都選擇JSON資料格式,JSON是一個輕量級的資料互動格式。

那麼我們給前端資料的時候都要轉成json格式,那就需要對我們從資料庫拿到的資料進行序列化。

接下來我們看下django序列化和rest_framework序列化的對比~~

Django的序列化方法

  .values 序列化結果   django serializers

 DRF序列化的方法

首先,我們要用DRF的序列化,就要遵循人家框架的一些標準,

  -- Django我們CBV繼承類是View,現在DRF我們要用APIView

  -- Django中返回的時候我們用HTTPResponse,JsonResponse,render ,DRF我們用Response

為什麼這麼用~我們之後會詳細講~~我們繼續來看序列化~~

序列化

  第一步 宣告序列化類   第二步 序列化物件

外來鍵關係的序列化

  外來鍵關係的序列化

反序列化

當前端給我們發post的請求的時候~前端給我們傳過來的資料~我們要進行一些校驗然後儲存到資料庫~

這些校驗以及儲存工作,DRF的Serializer也給我們提供了一些方法了~~

首先~我們要寫反序列化用的一些欄位~有些欄位要跟序列化區分開~~

Serializer提供了.is_valid()  和.save()方法~~

  反序列化serializer.py   反序列化views.py

當前端給我們傳送patch請求的時候,前端傳給我們使用者要更新的資料,我們要對資料進行部分驗證~~

  PATCH請求serializers.py   PATCH請求views.py

 驗證

如果我們需要對一些欄位進行自定義的驗證~DRF也給我們提供了鉤子方法~~

  單個欄位的驗證   多個欄位的驗證   驗證器 validators

 ModelSerializer

現在我們已經清楚了Serializer的用法,會發現我們所有的序列化跟我們的模型都緊密相關~

那麼,DRF也給我們提供了跟模型緊密相關的序列化器~~ModelSerializer~~

  -- 它會根據模型自動生成一組欄位

  -- 它簡單的預設實現了.update()以及.create()方法

定義一個ModelSerializer序列化器

  定義ModelSerializer

外來鍵關係的序列化

注意:當序列化類MATE中定義了depth時,這個序列化類中引用欄位(外來鍵)則自動變為只讀

  外來鍵關係序列化

自定義欄位

我們可以宣告一些欄位來覆蓋預設欄位,來進行自定製~

比如我們的選擇欄位,預設顯示的是選擇的key,我們要給使用者展示的是value。

  自定義欄位

Meta中其它關鍵字引數

  Meta中引數

post以及patch請求

由於depth會讓我們外來鍵變成只讀,所以我們再定義一個序列化的類,其實只要去掉depth就可以了~~

  post/patch請求序列化類

SerializerMethodField

外來鍵關聯的物件有很多欄位我們是用不到的~都傳給前端會有資料冗餘~就需要我們自己去定製序列化外來鍵物件的哪些欄位~~

  SerializerMethodField

用ModelSerializer改進上面Serializer的完整版

  ModelSerializer

為什麼要用序列化元件

當我們做前後端分離的專案~~我們前後端互動一般都選擇JSON資料格式,JSON是一個輕量級的資料互動格式。

那麼我們給前端資料的時候都要轉成json格式,那就需要對我們從資料庫拿到的資料進行序列化。

接下來我們看下django序列化和rest_framework序列化的對比~~

Django的序列化方法

  .values 序列化結果   django serializers

 DRF序列化的方法

首先,我們要用DRF的序列化,就要遵循人家框架的一些標準,

  -- Django我們CBV繼承類是View,現在DRF我們要用APIView

  -- Django中返回的時候我們用HTTPResponse,JsonResponse,render ,DRF我們用Response

為什麼這麼用~我們之後會詳細講~~我們繼續來看序列化~~

序列化

  第一步 宣告序列化類   第二步 序列化物件

外來鍵關係的序列化

  外來鍵關係的序列化

反序列化

當前端給我們發post的請求的時候~前端給我們傳過來的資料~我們要進行一些校驗然後儲存到資料庫~

這些校驗以及儲存工作,DRF的Serializer也給我們提供了一些方法了~~

首先~我們要寫反序列化用的一些欄位~有些欄位要跟序列化區分開~~

Serializer提供了.is_valid()  和.save()方法~~

  反序列化serializer.py   反序列化views.py

當前端給我們傳送patch請求的時候,前端傳給我們使用者要更新的資料,我們要對資料進行部分驗證~~

  PATCH請求serializers.py   PATCH請求views.py

 驗證

如果我們需要對一些欄位進行自定義的驗證~DRF也給我們提供了鉤子方法~~

  單個欄位的驗證   多個欄位的驗證   驗證器 validators

 ModelSerializer

現在我們已經清楚了Serializer的用法,會發現我們所有的序列化跟我們的模型都緊密相關~

那麼,DRF也給我們提供了跟模型緊密相關的序列化器~~ModelSerializer~~

  -- 它會根據模型自動生成一組欄位

  -- 它簡單的預設實現了.update()以及.create()方法

定義一個ModelSerializer序列化器

  定義ModelSerializer

外來鍵關係的序列化

注意:當序列化類MATE中定義了depth時,這個序列化類中引用欄位(外來鍵)則自動變為只讀

  外來鍵關係序列化

自定義欄位

我們可以宣告一些欄位來覆蓋預設欄位,來進行自定製~

比如我們的選擇欄位,預設顯示的是選擇的key,我們要給使用者展示的是value。

  自定義欄位

Meta中其它關鍵字引數

  Meta中引數

post以及patch請求

由於depth會讓我們外來鍵變成只讀,所以我們再定義一個序列化的類,其實只要去掉depth就可以了~~

  post/patch請求序列化類

SerializerMethodField

外來鍵關聯的物件有很多欄位我們是用不到的~都傳給前端會有資料冗餘~就需要我們自己去定製序列化外來鍵物件的哪些欄位~~

  SerializerMethodField

用ModelSerializer改進上面Serializer的完整版

  ModelSerializer