脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - django restframework序列化字段校验规则

django restframework序列化字段校验规则

2023-02-23 12:02YZL40514131 Python

本文主要介绍了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列表中(不加括号)

django restframework序列化字段校验规则

 

三、单个字段进行校验:项目名称不能多于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字段校验规则内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/YZL40514131/article/details/125006687

延伸 · 阅读

精彩推荐
  • Pythonpython使用folium库绘制地图点击框

    python使用folium库绘制地图点击框

    这篇文章主要为大家详细介绍了python使用folium库绘制地图点击框,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    staHuri8512021-04-04
  • Python深入理解Python分布式爬虫原理

    深入理解Python分布式爬虫原理

    本篇文章主要介绍了深入理解Python分布式爬虫原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    permike3662020-12-09
  • PythonPython 专题四 文件基础知识

    Python 专题四 文件基础知识

    本文主要讲述了Python文件基础知识,包括文件的打开、读写、关闭操作、使用循环读写文件及迭代器的知识。具有很好的参考价值。下面跟着小编一起来看...

    Eastmount5492020-09-24
  • PythonPython3.x对JSON的一些操作示例

    Python3.x对JSON的一些操作示例

    最近在学习python3,正巧遇到了一些json的操作,索性整理一下分享出来,下面这篇文章主要给大家介绍了关于Python3.x对JSON的一些操作,需要的朋友可以参考...

    RustFisher1842020-12-05
  • Python获取python运行输出的数据并解析存为dataFrame实例

    获取python运行输出的数据并解析存为dataFrame实例

    这篇文章主要介绍了获取python运行输出的数据并解析存为dataFrame实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 ...

    喝粥也会胖的唐僧7532020-07-08
  • Pythonpython 写的一个爬虫程序源码

    python 写的一个爬虫程序源码

    这篇文章主要介绍了python 写的一个爬虫程序源码,需要的朋友可以参考下 ...

    刘天斯18392020-08-14
  • Python如何用Python开发QQ机器人

    如何用Python开发QQ机器人

    虽然该文最终是达到以python开发mirai机器人的目的,但起步教程,尤其是环境配置上仍然有大量的相同操作,对其他编程语言仍有借鉴之处。...

    马哥Linux运维11842021-05-08
  • Python详解如何用django实现redirect的几种方法总结

    详解如何用django实现redirect的几种方法总结

    这篇文章主要介绍了如何用django实现redirect的几种方法总结,详细的介绍3种实现方式,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    晨戈4362021-04-21