DRF 中的模型序列化到底該怎么用?
本文轉(zhuǎn)載自微信公眾號(hào)「AirPython」,作者星安果。轉(zhuǎn)載本文請(qǐng)聯(lián)系A(chǔ)irPython公眾號(hào)。
1. 前言
大家好,我是安果!
接下來(lái),將通過(guò)幾篇文章將對(duì) DRF 模型序列化進(jìn)行展開說(shuō)明,詳情談?wù)勀P托蛄谢淖饔?、步驟及進(jìn)階用法
2. 模型序列化的作用?
作為 DRF 中非常關(guān)鍵的一步,模型序列化主要作用有 3 個(gè)
- 序列化數(shù)據(jù)
用于將模型序列化成 JSON 格式的對(duì)象,便于數(shù)據(jù)返回
- 表單驗(yàn)證
在表單請(qǐng)求中,用于驗(yàn)證用戶上傳的數(shù)據(jù)是否滿足項(xiàng)目要求
- 數(shù)據(jù)操作
可用于數(shù)據(jù)更新、數(shù)據(jù)創(chuàng)建、數(shù)據(jù)保存等
3. 表單字段驗(yàn)證
指定需要序列化的字段時(shí),可以設(shè)置字段類型、默認(rèn)值、可讀或可寫、驗(yàn)證錯(cuò)誤提示信息等,然后針對(duì)表單字段進(jìn)行驗(yàn)證
表單字段驗(yàn)證同樣有 3 種方式,分別對(duì)應(yīng):
3-1 序列化字段,使用參數(shù)形式進(jìn)行制定
比如,字段 name 數(shù)據(jù)類型為字符串,max_length 指定最大長(zhǎng)度,必須輸入,并使用「 error_messages 」設(shè)置驗(yàn)證失敗的提示信息
- # 最大長(zhǎng)度50
- # required=True:必須輸入
- # 如果不傳遞,則報(bào)錯(cuò):name必須要傳遞
- name = serializers.CharField(max_length=50, required=True, error_messages={"required": "name必須要傳遞"})
3-2 重寫 validate( self , attrs ) 方法進(jìn)行驗(yàn)證
參數(shù) attrs 包含所有字段
我們只需要自定義驗(yàn)證邏輯,如果驗(yàn)證不通過(guò),拋出「 serializers.ValidationError 」異常即可
比如,這里驗(yàn)證 name 中必須包含關(guān)鍵字「 深圳 」,否則拋出異常(代表驗(yàn)證失敗)
- def validate(self, attrs):
- """
- 表單數(shù)據(jù)驗(yàn)證
- :param attrs:
- :return:
- """
- print(attrs)
- if "深圳" not in attrs.get("name"):
- raise serializers.ValidationError('名稱中沒(méi)有包含【深圳】,驗(yàn)證失?。?)
- return attrs
3-3 重寫 validate_字段名(self,value) 方法
單獨(dú)針對(duì)某個(gè)字段進(jìn)行驗(yàn)證
比如,我們還是對(duì) name 字段進(jìn)行驗(yàn)證,如果驗(yàn)證不通過(guò),主動(dòng)拋出「 serializers.ValidationError 」異常即可
- def validate_name(self, name):
- """
- 對(duì)name字段進(jìn)行驗(yàn)證
- :param name:
- :return:
- """
- if "深圳" not in name:
- raise serializers.ValidationError('名稱中沒(méi)有包含【深圳】,驗(yàn)證失敗!')
- return name
4. 重寫創(chuàng)建、更新方法
創(chuàng)建的序列化類繼承于 serializers.Serializer 類
這里重寫 update() 和 create() 函數(shù)
其中,
- update( self, instance, validated_data )
用于更新數(shù)據(jù),將參數(shù) validated_data 中的數(shù)據(jù)更新到 instance 中
- create(self, validated_data)
validated_data 作為關(guān)鍵字參數(shù),用于創(chuàng)建模型
- class GoodsSerializer(serializers.Serializer):
- # 需要序列化的字段
- # 注意:自動(dòng)生成的字段,只會(huì)涉及讀取的場(chǎng)景
- id = serializers.IntegerField(read_only=True)
- # error_messages:定義錯(cuò)誤信息
- name = serializers.CharField(max_length=200, required=True, error_messages={"required": "name參數(shù)必須要傳遞"})
- def update(self, instance, validated_data):
- """
- 更新數(shù)據(jù),將validated_data中的數(shù)據(jù)更新到instance中
- :param instance:
- :param validated_data:
- :return:
- """
- # 修改數(shù)據(jù)
- instance.name = validated_data.get("name", instance.name)
- # 保存更新
- instance.save()
- return instance
- def create(self, validated_data):
- """
- 創(chuàng)建數(shù)據(jù)
- :param validated_data:
- :return:
- """
- # Goods:模型
- return Goods.objects.create(**validated_data)
5. 最后
本章講到模型普通序列化的步驟,關(guān)于模型序列化、序列化嵌套、項(xiàng)目實(shí)戰(zhàn)中流程,我將在下一篇文章進(jìn)行說(shuō)明。