django restframework序列化字段校驗(yàn)規(guī)則
一、怎么校驗(yàn)創(chuàng)建的項(xiàng)目名是否是唯一的,當(dāng)項(xiàng)目名name字段不唯一,怎么設(shè)置提示信息?
class ProjectsSerializer(serializers.Serializer): create_time=serializers.DateTimeField(label='創(chuàng)建時(shí)間',help_text='創(chuàng)建時(shí)間', format='%Y年%m月%d日 %H時(shí)%M分%S秒',read_only=True) update_time = serializers.DateTimeField(label='更新時(shí)間', help_text='更新時(shí)間', format='%Y年%m月%d日 %H時(shí)%M分%S秒', read_only=True) name=serializers.CharField(label='項(xiàng)目名稱(chēng)',help_text='項(xiàng)目名詞', max_length=20,min_length=3, error_messages={'min_length':'項(xiàng)目名稱(chēng)不能少于3位', 'max_length':'項(xiàng)目名稱(chēng)不能大于20'}, validators=[UniqueValidator(queryset=Projects.objects.all(),message='項(xiàng)目名稱(chēng)不能重復(fù)')])
??tip1:校驗(yàn)規(guī)則
1、可以在序列化器字段上使用validators指定自定義校驗(yàn)規(guī)則
2、validators必須得為序列類(lèi)型(一般為列表),在列表中可以添加多個(gè)校驗(yàn)規(guī)則
3、DRF框架自帶UniqueValidator校驗(yàn)器,必須得使用queryset指定查詢(xún)集對(duì)象,用于對(duì)該字段進(jìn)行校驗(yàn)
4、UniqueValidator校驗(yàn)器,可以使用message指定自定義報(bào)錯(cuò)信息
5、校驗(yàn)規(guī)則的執(zhí)行順序?
先對(duì)字段類(lèi)型進(jìn)行校驗(yàn)(CharField)——》依次驗(yàn)證validators列表中的校驗(yàn)規(guī)則——》從右到左依次驗(yàn)證其他規(guī)則——》調(diào)用單字段校驗(yàn)方法(如果有定義)
二、項(xiàng)目名稱(chēng)中必須得包含“項(xiàng)目”2字
def is_contains_keyword(value): is '項(xiàng)目' not in value: raise serializers.ValidationError("項(xiàng)目名稱(chēng)中必須包含'項(xiàng)目'關(guān)鍵字") class ProjectsSerializer(serializers.Serializer): create_time=serializers.DateTimeField(label='創(chuàng)建時(shí)間',help_text='創(chuàng)建時(shí)間', format='%Y年%m月%d日 %H時(shí)%M分%S秒',read_only=True) update_time = serializers.DateTimeField(label='更新時(shí)間', help_text='更新時(shí)間', format='%Y年%m月%d日 %H時(shí)%M分%S秒', read_only=True) name=serializers.CharField(label='項(xiàng)目名稱(chēng)',help_text='項(xiàng)目名詞', max_length=20,min_length=3, error_messages={'min_length':'項(xiàng)目名稱(chēng)不能少于3位', 'max_length':'項(xiàng)目名稱(chēng)不能大于20'}, validators=[UniqueValidator(queryset=Projects.objects.all(),message='項(xiàng)目名稱(chēng)不能重復(fù)'),is_contains_keyword])
??tip2:校驗(yàn)規(guī)則
1、可以在類(lèi)外面自定義校驗(yàn)函數(shù)
2、第一個(gè)參數(shù)為待校驗(yàn)的值(name)
3、如果校驗(yàn)不通過(guò),必須得拋出serializers.ValidationError(‘報(bào)錯(cuò)信息’)異常,同時(shí)可以指定具體得報(bào)錯(cuò)信息
4、需要將校驗(yàn)函數(shù)名放置到某一個(gè)字段的 validators列表中(不加括號(hào))
三、單個(gè)字段進(jìn)行校驗(yàn):項(xiàng)目名稱(chēng)不能多于10個(gè)字
def is_contains_keyword(value): is '項(xiàng)目' not in value: raise serializers.ValidationError("項(xiàng)目名稱(chēng)中必須包含'項(xiàng)目'關(guān)鍵字") class ProjectsSerializer(serializers.Serializer): create_time=serializers.DateTimeField(label='創(chuàng)建時(shí)間',help_text='創(chuàng)建時(shí)間', format='%Y年%m月%d日 %H時(shí)%M分%S秒',read_only=True) update_time = serializers.DateTimeField(label='更新時(shí)間', help_text='更新時(shí)間', format='%Y年%m月%d日 %H時(shí)%M分%S秒', read_only=True) name=serializers.CharField(label='項(xiàng)目名稱(chēng)',help_text='項(xiàng)目名詞', max_length=20,min_length=3, error_messages={'min_length':'項(xiàng)目名稱(chēng)不能少于3位', 'max_length':'項(xiàng)目名稱(chēng)不能大于20'}, validators=[UniqueValidator(queryset=Projects.objects.all(),message='項(xiàng)目名稱(chēng)不能重復(fù)'),is_contains_keyword]) class Meta: model=Projects fields='__all__' def validate_name(self,attr:str): if len(attr)>10: raise serializers.ValidationError('項(xiàng)目名稱(chēng)不能多于10個(gè)字') return attr
??tip3:校驗(yàn)規(guī)則
1、可以在序列化器類(lèi)中對(duì)單個(gè)字段進(jìn)行校驗(yàn)
2、但字段得校驗(yàn)方法名稱(chēng),必須把validate_作為前綴,加上待校驗(yàn)得字段名,如:validate_待校驗(yàn)得字段名
3、如果校驗(yàn)不通過(guò)必須得返回serializers.ValidationError(‘具體得報(bào)錯(cuò)信息’)
4、如果校驗(yàn)通過(guò),往往將校驗(yàn)之后得值返回
5、如果該字段在定義時(shí)添加得校驗(yàn)規(guī)則不通過(guò),那么是不會(huì)進(jìn)行單字段校驗(yàn)的;如果能對(duì)單字段進(jìn)行校驗(yàn)說(shuō)明上面是校驗(yàn)通過(guò)的。
6、必須返回attr(當(dāng)然如果不返回attr也不會(huì)報(bào)錯(cuò))
四、多字段進(jìn)行校驗(yàn):
class RegisterModelSerializer(serializers.ModelSerializer): password_confirm = serializers.CharField(label='確認(rèn)密碼', help_text='確認(rèn)密碼', error_messages={"min_length": "允許輸入5-20個(gè)字符", "max_length": "允許輸入5-20個(gè)字符", }, 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'] # 校驗(yàn)密碼與驗(yàn)證碼密碼 def validate(self, attrs): password=attrs.get('password') password=attrs.get('password_confirm') if password!=password_confirm: raise serializers.ValidationError('密碼和確認(rèn)密碼不一致') return attrs
??tip4:校驗(yàn)規(guī)則
1、可以在序列化器類(lèi)中對(duì)多個(gè)字段進(jìn)行聯(lián)合校驗(yàn)
2、使用固定得validate方法,會(huì)接受上面校驗(yàn)通過(guò)之后得字典數(shù)據(jù)
3、當(dāng)所有字段定義時(shí)添加的校驗(yàn)規(guī)則都通過(guò),并且每個(gè)字典得單字段校驗(yàn)通過(guò)得情況下,才會(huì)調(diào)用validate方法
4、必須返回attrs
五、to_internal_value方法,是所有字段開(kāi)始進(jìn)行校驗(yàn)時(shí)的入口方法(最先調(diào)用的方法)
class InterfacesSerializer(serializers.ModelSerializer): project=serializer.StringRelatedField(label='接口所屬項(xiàng)目',help_text='接口所屬項(xiàng)目',read_only=True) project_id=serializer.PrimaryKeyRelatedField(label='接口所屬項(xiàng)目id',help_text='接口所屬項(xiàng)目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方法,是序列化輸出的入口方法
校驗(yàn)順序?yàn)椋菏紫葘?duì)字段類(lèi)型進(jìn)行校驗(yàn)——》依次驗(yàn)證validators列表中的校驗(yàn)規(guī)則——》從右到左驗(yàn)證其他的校驗(yàn)規(guī)則——》調(diào)用單字段校驗(yàn)方法(如果有定義)——》調(diào)用多字段聯(lián)合調(diào)用validate方法
到此這篇關(guān)于django restframework序列化字段校驗(yàn)規(guī)則的文章就介紹到這了,更多相關(guān)django restframework字段校驗(yàn)規(guī)則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pytorch模型部署 pth轉(zhuǎn)onnx的方法
這篇文章主要介紹了pytorch模型部署 pth轉(zhuǎn)onnx的相關(guān)知識(shí),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05社區(qū)版pycharm創(chuàng)建django項(xiàng)目的方法(pycharm的newproject左側(cè)沒(méi)有項(xiàng)目選項(xiàng))
pycharm的newproject左側(cè)沒(méi)有出現(xiàn)項(xiàng)目選項(xiàng)的情況下,創(chuàng)建Django項(xiàng)目的解決方法./社區(qū)版pycharm創(chuàng)建django項(xiàng)目的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-09-09Python爬蟲(chóng)爬取微博熱搜保存為 Markdown 文件的源碼
這篇文章主要介紹了Python爬蟲(chóng)爬取微博熱搜保存為 Markdown 文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Python中xml和dict格式轉(zhuǎn)換的示例代碼
最近在做APP的接口,遇到XML格式的請(qǐng)求數(shù)據(jù),費(fèi)了很大勁來(lái)解決,下面小編給大家分享下Python中xml和dict格式轉(zhuǎn)換問(wèn)題,感興趣的朋友跟隨小編一起看看吧2019-11-11淺析python遞歸函數(shù)和河內(nèi)塔問(wèn)題
這篇文章主要介紹了python遞歸函數(shù)和河內(nèi)塔問(wèn)題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-04-04人機(jī)交互程序 python實(shí)現(xiàn)人機(jī)對(duì)話(huà)
這篇文章主要為大家詳細(xì)介紹了人機(jī)交互程序,初步實(shí)現(xiàn)python人機(jī)對(duì)話(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11pytorch中交叉熵?fù)p失函數(shù)的使用小細(xì)節(jié)
這篇文章主要介紹了pytorch中交叉熵?fù)p失函數(shù)的使用細(xì)節(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02