DRF - serializers - 基礎 - 1.0

理解(重點)

  • 序列化器 - Serializer類

class - 本質上是一個類,我們定義了它,就是來處理數據的,是獨立於model數據庫之外的存在(不要混淆)

  • 序列化器對象 - Serializer對象

本質上就是上邊那個類的一個實例,這個對象就是處理 序列化反序列化樞紐核心,邏輯上面向的對象

# 序列化器對象 - 構造方法
serializer = Serializer(instance=None, data=empty, **kwarg)

說明:

1)用於序列化時,將模型類對象傳入instance參數

2)用於反序列化時,將要被反序列化的數據傳入data參數

3)除了instance和data參數外,在構造Serializer對象時,還可通過context參數額外添加數據,如

serializer = AccountSerializer(account, context={'request': request})   # account,其實就是 instance=account 位置參數

 通過context參數附加的數據,可以通過Serializer對象的context屬性獲取

注意: partial

默認序列化器必須傳遞所有required的字段,否則會拋出驗證異常

可以使用 partial 參數來允許部分字段更新(常用場景:修改對象數據,即調用save()方法時,使用序列化器的update方法)

serializer = BookInfoSerializer(instance=book, data={'pub_date': '2999-1-1'}, partial=True)

序列化的使用

  • 基本使用
# 一條數據(一條記錄)
book = BookInfo.objects.get(id=4)
serializer = BookInfoSerializer(book)
serializer.data      # data屬性,可以獲取序列化後的數據


# 包含多條數據(多條記錄)的查詢集QuerySet,可以通過添加many=True參數,說明
books = BookInfo.objects.all()
serializer = BookInfoSerializer(books, many=True)
serializer.data
  • 關聯對象 - 嵌套序列化

以後具體在寫


反序列化的使用

  • 驗證

異常處理:

is_valid()方法,還可以在驗證失敗時拋出異常serializers.ValidationError,可以通過傳遞raise_exception=True參數開啓,

REST framework接收到此異常,會向前端返回HTTP 400 Bad Request響應

# 驗證
# 在獲取反序列化的數據前,必須調用is_valid()方法進行驗證,驗證成功返回True,否則返回False
serializer.is_valid(raise_exception=True)

# 驗證 - 失敗
# errors屬性,獲取錯誤信息,返回字典,包含了字段和相應字段的錯誤描述(key:value)
serializer.errors

# 驗證 - 成功
# validated_data屬性,獲取校驗後(反序列化)的數據  --- 此時的errors屬性,是{},空字典
serializer.validated_data
  • 保存

如果在驗證成功後,想要基於validated_data,完成數據對象的創建/修改,可以通過實現create()和update()兩個方法來實現

class BookInfoSerializer(serializers.Serializer):

    ... ...

    def create(self, validated_data):
        """新建"""
        return BookInfo.objects.create(**validated_data)

    def update(self, instance, validated_data):
        """更新,instance爲要修改的對象實例"""
        instance.name = validated_data.get('name', instance.name)   # 注意使用 get 獲取字典中的數據,這樣更新成功,則是新數據,更新失敗,則還是原來的數據 instance.name
        instance.pub_date = validated_data.get('pub_date', instance.pub_date)
        instance.save()
        return instance

實現了上述兩個方法後,在反序列化數據的時候,就可以通過save()方法,返回一個數據對象實例了

# 視圖中,調用 serializer 該序列化器對象的save()方法即可
book = serializer.save()

# 核心點  --  創建序列化器對象的時候:
# 沒有傳遞instance實例,調用save()方法的時候,create()被調用 -- 新建
# 傳遞了instance實例,則調用save()方法的時候,update()被調用 -- 修改

注意:

在對序列化器進行save()保存時,可以額外傳遞數據,這些數據可以在create()和update()中的validated_data參數獲取到

serializer.save(owner=request.user)

 

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