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. 最後
本章講到模型普通序列化的步驟,關於模型序列化、序列化嵌套、項目實戰中流程,我將在下一篇文章進行說明
如果你覺得文章還不錯,請大家 點贊、分享、留言 下,因爲這將是我持續輸出更多優質文章的最強動力!