django restframework序列化字段校驗規(guī)則
一、怎么校驗創(chuàng)建的項目名是否是唯一的,當(dāng)項目名name字段不唯一,怎么設(shè)置提示信息?
class ProjectsSerializer(serializers.Serializer):
create_time=serializers.DateTimeField(label='創(chuàng)建時間',help_text='創(chuàng)建時間',
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='項目名稱不能重復(fù)')])
??tip1:校驗規(guī)則
1、可以在序列化器字段上使用validators指定自定義校驗規(guī)則
2、validators必須得為序列類型(一般為列表),在列表中可以添加多個校驗規(guī)則
3、DRF框架自帶UniqueValidator校驗器,必須得使用queryset指定查詢集對象,用于對該字段進(jìn)行校驗
4、UniqueValidator校驗器,可以使用message指定自定義報錯信息
5、校驗規(guī)則的執(zhí)行順序?
先對字段類型進(jìn)行校驗(CharField)——》依次驗證validators列表中的校驗規(guī)則——》從右到左依次驗證其他規(guī)則——》調(diào)用單字段校驗方法(如果有定義)
二、項目名稱中必須得包含“項目”2字
def is_contains_keyword(value):
is '項目' not in value:
raise serializers.ValidationError("項目名稱中必須包含'項目'關(guān)鍵字")
class ProjectsSerializer(serializers.Serializer):
create_time=serializers.DateTimeField(label='創(chuàng)建時間',help_text='創(chuàng)建時間',
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='項目名稱不能重復(fù)'),is_contains_keyword])
??tip2:校驗規(guī)則
1、可以在類外面自定義校驗函數(shù)
2、第一個參數(shù)為待校驗的值(name)
3、如果校驗不通過,必須得拋出serializers.ValidationError(‘報錯信息’)異常,同時可以指定具體得報錯信息
4、需要將校驗函數(shù)名放置到某一個字段的 validators列表中(不加括號)

三、單個字段進(jìn)行校驗:項目名稱不能多于10個字
def is_contains_keyword(value):
is '項目' not in value:
raise serializers.ValidationError("項目名稱中必須包含'項目'關(guān)鍵字")
class ProjectsSerializer(serializers.Serializer):
create_time=serializers.DateTimeField(label='創(chuàng)建時間',help_text='創(chuàng)建時間',
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='項目名稱不能重復(fù)'),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:校驗規(guī)則
1、可以在序列化器類中對單個字段進(jìn)行校驗
2、但字段得校驗方法名稱,必須把validate_作為前綴,加上待校驗得字段名,如:validate_待校驗得字段名
3、如果校驗不通過必須得返回serializers.ValidationError(‘具體得報錯信息’)
4、如果校驗通過,往往將校驗之后得值返回
5、如果該字段在定義時添加得校驗規(guī)則不通過,那么是不會進(jìn)行單字段校驗的;如果能對單字段進(jìn)行校驗說明上面是校驗通過的。
6、必須返回attr(當(dāng)然如果不返回attr也不會報錯)
四、多字段進(jìn)行校驗:
class RegisterModelSerializer(serializers.ModelSerializer):
password_confirm = serializers.CharField(label='確認(rèn)密碼', help_text='確認(rèn)密碼',
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('密碼和確認(rèn)密碼不一致')
return attrs
??tip4:校驗規(guī)則
1、可以在序列化器類中對多個字段進(jìn)行聯(lián)合校驗
2、使用固定得validate方法,會接受上面校驗通過之后得字典數(shù)據(jù)
3、當(dāng)所有字段定義時添加的校驗規(guī)則都通過,并且每個字典得單字段校驗通過得情況下,才會調(diào)用validate方法
4、必須返回attrs
五、to_internal_value方法,是所有字段開始進(jìn)行校驗時的入口方法(最先調(diào)用的方法)
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方法,是序列化輸出的入口方法
校驗順序為:首先對字段類型進(jìn)行校驗——》依次驗證validators列表中的校驗規(guī)則——》從右到左驗證其他的校驗規(guī)則——》調(diào)用單字段校驗方法(如果有定義)——》調(diào)用多字段聯(lián)合調(diào)用validate方法
到此這篇關(guān)于django restframework序列化字段校驗規(guī)則的文章就介紹到這了,更多相關(guān)django restframework字段校驗規(guī)則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pandas實現(xiàn)groupby分組統(tǒng)計方法實例
在數(shù)據(jù)處理的過程,有可能需要對一堆數(shù)據(jù)分組處理,例如對不同的列進(jìn)行agg聚合操作(mean,min,max等等),下面這篇文章主要給大家介紹了關(guān)于Pandas實現(xiàn)groupby分組統(tǒng)計方法的相關(guān)資料,需要的朋友可以參考下2023-06-06
Scrapy將數(shù)據(jù)保存到Excel和MySQL中的方法實現(xiàn)
本文主要介紹了Scrapy將數(shù)據(jù)保存到Excel和MySQL中的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
淺談python for循環(huán)的巧妙運用(迭代、列表生成式)
下面小編就為大家?guī)硪黄獪\談python for循環(huán)的巧妙運用(迭代、列表生成式)。2017-09-09

