django restframework序列化字段校驗規則
一、怎麼校驗創建的項目名是否是唯一的,當項目名name字段不唯一,怎麼設置提示信息?
class ProjectsSerializer(serializers.Serializer): create_time=serializers.DateTimeField(label='創建時間',help_text='創建時間', format='%Y年%m月%d日 %H時%M分%S秒',read_only=True) update_time = serializers.DateTimeField(label='更新時間', help_text='更新時間', format='%Y年%m月%d日 %H時%M分%S秒', read_only=True) name=serializers.CharField(label='項目名稱',help_text='項目名詞', max_length=20,min_length=3, error_messages={'min_length':'項目名稱不能少於3位', 'max_length':'項目名稱不能大於20'}, validators=[UniqueValidator(queryset=Projects.objects.all(),message='項目名稱不能重復')])
🌟tip1:校驗規則
1、可以在序列化器字段上使用validators指定自定義校驗規則
2、validators必須得為序列類型(一般為列表),在列表中可以添加多個校驗規則
3、DRF框架自帶UniqueValidator校驗器,必須得使用queryset指定查詢集對象,用於對該字段進行校驗
4、UniqueValidator校驗器,可以使用message指定自定義報錯信息
5、校驗規則的執行順序?
先對字段類型進行校驗(CharField)——》依次驗證validators列表中的校驗規則——》從右到左依次驗證其他規則——》調用單字段校驗方法(如果有定義)
二、項目名稱中必須得包含“項目”2字
def is_contains_keyword(value): is '項目' not in value: raise serializers.ValidationError("項目名稱中必須包含'項目'關鍵字") class ProjectsSerializer(serializers.Serializer): create_time=serializers.DateTimeField(label='創建時間',help_text='創建時間', format='%Y年%m月%d日 %H時%M分%S秒',read_only=True) update_time = serializers.DateTimeField(label='更新時間', help_text='更新時間', format='%Y年%m月%d日 %H時%M分%S秒', read_only=True) name=serializers.CharField(label='項目名稱',help_text='項目名詞', max_length=20,min_length=3, error_messages={'min_length':'項目名稱不能少於3位', 'max_length':'項目名稱不能大於20'}, validators=[UniqueValidator(queryset=Projects.objects.all(),message='項目名稱不能重復'),is_contains_keyword])
🌟tip2:校驗規則
1、可以在類外面自定義校驗函數
2、第一個參數為待校驗的值(name)
3、如果校驗不通過,必須得拋出serializers.ValidationError(‘報錯信息’)異常,同時可以指定具體得報錯信息
4、需要將校驗函數名放置到某一個字段的 validators列表中(不加括號)
三、單個字段進行校驗:項目名稱不能多於10個字
def is_contains_keyword(value): is '項目' not in value: raise serializers.ValidationError("項目名稱中必須包含'項目'關鍵字") class ProjectsSerializer(serializers.Serializer): create_time=serializers.DateTimeField(label='創建時間',help_text='創建時間', format='%Y年%m月%d日 %H時%M分%S秒',read_only=True) update_time = serializers.DateTimeField(label='更新時間', help_text='更新時間', format='%Y年%m月%d日 %H時%M分%S秒', read_only=True) name=serializers.CharField(label='項目名稱',help_text='項目名詞', max_length=20,min_length=3, error_messages={'min_length':'項目名稱不能少於3位', 'max_length':'項目名稱不能大於20'}, validators=[UniqueValidator(queryset=Projects.objects.all(),message='項目名稱不能重復'),is_contains_keyword]) class Meta: model=Projects fields='__all__' def validate_name(self,attr:str): if len(attr)>10: raise serializers.ValidationError('項目名稱不能多於10個字') return attr
🌟tip3:校驗規則
1、可以在序列化器類中對單個字段進行校驗
2、但字段得校驗方法名稱,必須把validate_作為前綴,加上待校驗得字段名,如:validate_待校驗得字段名
3、如果校驗不通過必須得返回serializers.ValidationError(‘具體得報錯信息’)
4、如果校驗通過,往往將校驗之後得值返回
5、如果該字段在定義時添加得校驗規則不通過,那麼是不會進行單字段校驗的;如果能對單字段進行校驗說明上面是校驗通過的。
6、必須返回attr(當然如果不返回attr也不會報錯)
四、多字段進行校驗:
class RegisterModelSerializer(serializers.ModelSerializer): password_confirm = serializers.CharField(label='確認密碼', help_text='確認密碼', error_messages={"min_length": "允許輸入5-20個字符", "max_length": "允許輸入5-20個字符", }, write_only=True) token = serializers.CharField(label='token', help_text='token', read_only=True) class Meta: model = User fields = ['id', 'username', 'password', 'password_confirm', 'token', 'email'] # 校驗密碼與驗證碼密碼 def validate(self, attrs): password=attrs.get('password') password=attrs.get('password_confirm') if password!=password_confirm: raise serializers.ValidationError('密碼和確認密碼不一致') return attrs
🌟tip4:校驗規則
1、可以在序列化器類中對多個字段進行聯合校驗
2、使用固定得validate方法,會接受上面校驗通過之後得字典數據
3、當所有字段定義時添加的校驗規則都通過,並且每個字典得單字段校驗通過得情況下,才會調用validate方法
4、必須返回attrs
五、to_internal_value方法,是所有字段開始進行校驗時的入口方法(最先調用的方法)
class InterfacesSerializer(serializers.ModelSerializer): project=serializer.StringRelatedField(label='接口所屬項目',help_text='接口所屬項目',read_only=True) project_id=serializer.PrimaryKeyRelatedField(label='接口所屬項目id',help_text='接口所屬項目id',queryset=Projects.objects.all(),write_only=True) class Meta: model=Interfaces fields=['id','name','tester','project','create_time','desc','project_id'] #exclude=['update_time'] extra_kwargs={ "create_time":{ "read_only":True, "format":"%Y年%m月%d日 %H:%M:%S", } } def to_internal_value(self,data): result=super().to_intrenal_value(data) result['project_id']=result.get('project_id').id return result
六、to_representation方法,是序列化輸出的入口方法
校驗順序為:首先對字段類型進行校驗——》依次驗證validators列表中的校驗規則——》從右到左驗證其他的校驗規則——》調用單字段校驗方法(如果有定義)——》調用多字段聯合調用validate方法
到此這篇關於django restframework序列化字段校驗規則的文章就介紹到這瞭,更多相關django restframework字段校驗規則內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Python編程使用DRF實現一次性驗證碼OTP
- Django序列化組件Serializers使用詳解
- Python Django框架中表單的用法詳解
- python Django實現增刪改查實戰代碼
- Python使用描述器實現ORM模型的方法詳解