" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django restframework序列化字段校驗(yàn)規(guī)則

 更新時(shí)間:2022年05月31日 15:50:11   作者:YZL40514131  
本文主要介紹了django restframework序列化字段校驗(yàn)規(guī)則,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、怎么校驗(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)目名稱',help_text='項(xiàng)目名詞',
                               max_length=20,min_length=3,
                               error_messages={'min_length':'項(xiàng)目名稱不能少于3位',
                                               'max_length':'項(xiàng)目名稱不能大于20'},
                               validators=[UniqueValidator(queryset=Projects.objects.all(),message='項(xiàng)目名稱不能重復(fù)')])

??tip1:校驗(yàn)規(guī)則

1、可以在序列化器字段上使用validators指定自定義校驗(yàn)規(guī)則
2、validators必須得為序列類型(一般為列表),在列表中可以添加多個(gè)校驗(yàn)規(guī)則
3、DRF框架自帶UniqueValidator校驗(yàn)器,必須得使用queryset指定查詢集對(duì)象,用于對(duì)該字段進(jìn)行校驗(yàn)
4、UniqueValidator校驗(yàn)器,可以使用message指定自定義報(bào)錯(cuò)信息
5、校驗(yàn)規(guī)則的執(zhí)行順序?
先對(duì)字段類型進(jìn)行校驗(yàn)(CharField)——》依次驗(yàn)證validators列表中的校驗(yàn)規(guī)則——》從右到左依次驗(yàn)證其他規(guī)則——》調(diào)用單字段校驗(yàn)方法(如果有定義)

二、項(xiàng)目名稱中必須得包含“項(xiàng)目”2字

def is_contains_keyword(value):
	is '項(xiàng)目' not in value:
		raise serializers.ValidationError("項(xià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)目名稱',help_text='項(xiàng)目名詞',
                               max_length=20,min_length=3,
                               error_messages={'min_length':'項(xiàng)目名稱不能少于3位',
                                               'max_length':'項(xiàng)目名稱不能大于20'},
                               validators=[UniqueValidator(queryset=Projects.objects.all(),message='項(xiàng)目名稱不能重復(fù)'),is_contains_keyword])

??tip2:校驗(yàn)規(guī)則

1、可以在類外面自定義校驗(yàn)函數(shù)
2、第一個(gè)參數(shù)為待校驗(yàn)的值(name)
3、如果校驗(yàn)不通過,必須得拋出serializers.ValidationError(‘報(bào)錯(cuò)信息’)異常,同時(shí)可以指定具體得報(bào)錯(cuò)信息
4、需要將校驗(yàn)函數(shù)名放置到某一個(gè)字段的 validators列表中(不加括號(hào))

在這里插入圖片描述

三、單個(gè)字段進(jìn)行校驗(yàn):項(xiàng)目名稱不能多于10個(gè)字

def is_contains_keyword(value):
	is '項(xiàng)目' not in value:
		raise serializers.ValidationError("項(xià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)目名稱',help_text='項(xiàng)目名詞',
                               max_length=20,min_length=3,
                               error_messages={'min_length':'項(xiàng)目名稱不能少于3位',
                                               'max_length':'項(xiàng)目名稱不能大于20'},
                               validators=[UniqueValidator(queryset=Projects.objects.all(),message='項(xià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)目名稱不能多于10個(gè)字')
    	return attr

??tip3:校驗(yàn)規(guī)則

1、可以在序列化器類中對(duì)單個(gè)字段進(jìn)行校驗(yàn)
2、但字段得校驗(yàn)方法名稱,必須把validate_作為前綴,加上待校驗(yàn)得字段名,如:validate_待校驗(yàn)得字段名
3、如果校驗(yàn)不通過必須得返回serializers.ValidationError(‘具體得報(bào)錯(cuò)信息’)
4、如果校驗(yàn)通過,往往將校驗(yàn)之后得值返回
5、如果該字段在定義時(shí)添加得校驗(yàn)規(guī)則不通過,那么是不會(huì)進(jìn)行單字段校驗(yàn)的;如果能對(duì)單字段進(jìn)行校驗(yàn)說明上面是校驗(yàn)通過的。
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、可以在序列化器類中對(duì)多個(gè)字段進(jìn)行聯(lián)合校驗(yàn)
2、使用固定得validate方法,會(huì)接受上面校驗(yàn)通過之后得字典數(shù)據(jù)
3、當(dāng)所有字段定義時(shí)添加的校驗(yàn)規(guī)則都通過,并且每個(gè)字典得單字段校驗(yàn)通過得情況下,才會(huì)調(diào)用validate方法
4、必須返回attrs

五、to_internal_value方法,是所有字段開始進(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ì)字段類型進(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)文章

  • 關(guān)于python中.xpath的使用問題

    關(guān)于python中.xpath的使用問題

    根據(jù)xpath定位到了tr,注意瀏覽器自動(dòng)生成了tbody,在python中要把自動(dòng)生成的tbody層級(jí)去掉,這樣要怎么操作呢?下面通過代碼給大家介紹下python中.xpath的使用問題,感興趣的朋友一起看看吧
    2021-11-11
  • Pandas實(shí)現(xiàn)groupby分組統(tǒng)計(jì)方法實(shí)例

    Pandas實(shí)現(xiàn)groupby分組統(tǒng)計(jì)方法實(shí)例

    在數(shù)據(jù)處理的過程,有可能需要對(duì)一堆數(shù)據(jù)分組處理,例如對(duì)不同的列進(jìn)行agg聚合操作(mean,min,max等等),下面這篇文章主要給大家介紹了關(guān)于Pandas實(shí)現(xiàn)groupby分組統(tǒng)計(jì)方法的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Python 做曲線擬合和求積分的方法

    Python 做曲線擬合和求積分的方法

    今天小編就為大家分享一篇Python 做曲線擬合和求積分的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 分享20個(gè)Pandas短小精悍的數(shù)據(jù)操作

    分享20個(gè)Pandas短小精悍的數(shù)據(jù)操作

    本文為大家整理了一個(gè)pandas數(shù)據(jù)操作的大集合,共20個(gè)功能,個(gè)個(gè)短小精悍,一次讓你愛個(gè)夠,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2022-04-04
  • Scrapy將數(shù)據(jù)保存到Excel和MySQL中的方法實(shí)現(xiàn)

    Scrapy將數(shù)據(jù)保存到Excel和MySQL中的方法實(shí)現(xiàn)

    本文主要介紹了Scrapy將數(shù)據(jù)保存到Excel和MySQL中的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Python 多線程抓取圖片效率對(duì)比

    Python 多線程抓取圖片效率對(duì)比

    Python由于有全鎖局的存在,并不能利用多核優(yōu)勢(shì)。所以,如果你的多線程進(jìn)程是CPU密集型的,那多線程并不能帶來效率上的提升,相反還可能會(huì)因?yàn)榫€程的頻繁切換,導(dǎo)致效率下降;如果是IO密集型,多線程進(jìn)程可以利用IO阻塞等待時(shí)的空閑時(shí)間執(zhí)行其他線程,提升效率。
    2016-02-02
  • Python字符串格式化輸出代碼實(shí)例

    Python字符串格式化輸出代碼實(shí)例

    這篇文章主要介紹了Python字符串格式化輸出代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 淺談python for循環(huán)的巧妙運(yùn)用(迭代、列表生成式)

    淺談python for循環(huán)的巧妙運(yùn)用(迭代、列表生成式)

    下面小編就為大家?guī)硪黄獪\談python for循環(huán)的巧妙運(yùn)用(迭代、列表生成式)。
    2017-09-09
  • 使用Python打造高效的PDF文件管理應(yīng)用

    使用Python打造高效的PDF文件管理應(yīng)用

    在日常工作和學(xué)習(xí)中,我們經(jīng)常需要處理大量PDF文件,本文將使用Python的wxPython和PyMuPDF庫(kù),開發(fā)一個(gè)強(qiáng)大且易用的PDF文件管理工具,需要的可以參考下
    2024-12-12
  • python動(dòng)態(tài)視頻下載器的實(shí)現(xiàn)方法

    python動(dòng)態(tài)視頻下載器的實(shí)現(xiàn)方法

    這里向大家分享一下python爬蟲的一些應(yīng)用,主要是用爬蟲配合簡(jiǎn)單的GUI界面實(shí)現(xiàn)視頻,音樂和小說的下載器。今天就先介紹如何實(shí)現(xiàn)一個(gè)動(dòng)態(tài)視頻下載器,需要的朋友可以參考下
    2019-09-09

最新評(píng)論

凯里市| 公安县| 陆河县| 静乐县| 邯郸市| 印江| 乐陵市| 皮山县| 武山县| 大关县| 镇雄县| 弋阳县| 长治市| 安龙县| 分宜县| 保亭| 襄垣县| 汉中市| 滨州市| 浦城县| 抚顺市| 汉阴县| 龙海市| 新龙县| 泸定县| 长岛县| 富宁县| 临武县| 大石桥市| 克拉玛依市| 古蔺县| 孝感市| 巩留县| 青田县| 岑溪市| 桓台县| 呼图壁县| 抚远县| 麻江县| 梁河县| 高雄县|