首頁 > 科技

DRF中的模型序列化到底該怎麼用?

2021-06-28 13:39:33

來源:AirPython

作者:星安果

1. 前言

大家好,我是安果!

之前有寫過一篇文章,聊到如何快速入門 Django DRF

接下來,將通過幾篇文章將對 DRF 模型序列化進行展開說明,詳情談談模型序列化的作用、步驟及進階用法

2. 模型序列化的作用?

作為 DRF 中非常關鍵的一步,模型序列化主要作用有 3 個

序列化資料用於將模型序列化成 JSON 格式的物件,便於資料返回表單驗證在表單請求中,用於驗證使用者上傳的資料是否滿足項目要求資料操作可用於資料更新、資料創建、資料儲存等

3. 表單欄位驗證

指定需要序列化的欄位時,可以設定欄位類型、預設值、可讀或可寫、驗證錯誤提示資訊等,然後針對表單欄位進行驗證

表單欄位驗證同樣有 3 種方式,分別對應:

3-1序列化欄位,使用參數形式進行制定

比如,欄位 name 資料類型為字元串,max_length 指定最大長度,必須輸入,並使用「 error_messages 」設定驗證失敗的提示資訊

# 最大長度50# required=True:必須輸入# 如果不傳遞,則報錯:name必須要傳遞name = serializers.CharField(max_length=50, required=True, error_messages={"required": "name必須要傳遞"})

3-2重寫 validate( self , attrs ) 方法進行驗證

參數 attrs 包含所有欄位

我們只需要自定義驗證邏輯,如果驗證不通過,拋出「 serializers.ValidationError 」異常即可

比如,這裡驗證 name 中必須包含關鍵字「 深圳 」,否則拋出異常(代表驗證失敗)

def validate(self, attrs):""" 表單資料驗證 :param attrs: :return: """ print(attrs) if "深圳" not in attrs.get("name"): raise serializers.ValidationError('名稱中沒有包含【深圳】,驗證失敗!') return attrs

3-3重寫 validate_欄位名(self,value) 方法

單獨針對某個欄位進行驗證

比如,我們還是對 name 欄位進行驗證,如果驗證不通過,主動拋出「 serializers.ValidationError 」異常即可

def validate_name(self, name):""" 對name欄位進行驗證 :param name: :return: """ if "深圳" not in name: raise serializers.ValidationError('名稱中沒有包含【深圳】,驗證失敗!') return name

4. 重寫創建、更新方法

創建的序列化類繼承於 serializers.Serializer 類

這裡重寫 update() 和 create() 函數

其中,

update( self, instance, validated_data )用於更新資料,將參數 validated_data 中的資料更新到 instance 中create(self, validated_data)validated_data 作為關鍵字參數,用於創建模型class GoodsSerializer(serializers.Serializer): # 需要序列化的欄位 # 注意:自動生成的欄位,只會涉及讀取的場景 id = serializers.IntegerField(read_only=True) # error_messages:定義錯誤資訊 name = serializers.CharField(max_length=200, required=True, error_messages={"required": "name參數必須要傳遞"}) def update(self, instance, validated_data): """ 更新資料,將validated_data中的資料更新到instance中 :param instance: :param validated_data: :return: """ # 修改資料 instance.name = validated_data.get("name", instance.name) # 儲存更新 instance.save() return instance def create(self, validated_data): """ 創建資料 :param validated_data: :return: """ # Goods:模型 return Goods.objects.create(**validated_data)

5. 最後

本章講到模型普通序列化的步驟,關於模型序列化、序列化巢狀、項目實戰中流程,我將在下一篇文章進行說明

如果你覺得文章還不錯,請大家 點贊、分享、留言下,因為這將是我持續輸出更多優質文章的最強動力!


IT145.com E-mail:sddin#qq.com