一、怎么校验创建的项目名是否是唯一的,当项目名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字段校验规则内容请搜索Devmax以前的文章或继续浏览下面的相关文章希望大家以后多多支持Devmax!

django restframework序列化字段校验规则的更多相关文章

  1. 难以在Android和iPhone上部署Django应用程序..计划切换到PHP而不是Django

    .我是否需要学习PHP,C,Java或其他任何东西,或者只要知道django和python就可以做到这一点?

  2. Android发送发送请求到django服务器csrf失败

    我想我的Android应用程序能够发送一些信息到我的django服务器.所以我做的Android应用程序发送一个发布请求到mysite/上传页面,django的这个页面的视图将基于post数据工作.问题是服务器对post请求的响应,关于csrf验证失败.看看这个问题,似乎我可能必须先从服务器获取一个csrf令牌,然后用该令牌做帖子但是我不知道我该怎么做.编辑:我已经发现,我可以使用视图装饰器@cs

  3. 使用AJAX完成用户名是否存在异步校验

    这篇文章主要介绍了使用AJAX完成用户名是否存在异步校验的相关资料,需要的朋友可以参考下

  4. pycharm社区版安装django并创建一个简单项目的全过程

    社区版的pycharm跟专业版的pycharm应用差别还是不太大,下面这篇文章主要给大家介绍了关于pycharm社区版安装django并创建一个简单项目的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

  5. Django 报错:Broken pipe from ('127.0.0.1', 58924)的解决

    这篇文章主要介绍了Django 报错:Broken pipe from ('127.0.0.1', 58924)的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  6. 解决Django cors跨域问题

    这篇文章主要介绍了解决Django cors跨域问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  7. vue中输入框事件的使用及数值校验方式

    这篇文章主要介绍了vue中输入框事件的使用及数值校验方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  8. element表单使用校验之校验失效问题详解

    最近工作中遇到了element表单校验失败的情况,通过查找相关资料终于解决了,所以下面这篇文章主要给大家介绍了关于element表单使用校验之校验失效问题的相关资料,需要的朋友可以参考下

  9. Ajax校验是否重复的实现代码

    这篇文章主要介绍了Ajax校验是否重复的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下

  10. 虚拟环境下搭建一个Django项目

    这篇文章主要为大家介绍了虚拟环境下搭建一个Django项目的实现过程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部