django restframework序列化字段校验规则是什么
这篇文章主要介绍“django restframework序列化字段校验规则是什么”,在日常操作中,相信很多人在django restframework序列化字段校验规则是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”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列表中(不加括号)
三、单个字段进行校验:项目名称不能多于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序列化字段校验规则是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注蜗牛博客网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论