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

1. 前言

​大家好,我是安果!

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

5 分鐘,帶你快速入門 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. 最後

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章