DRF--验证器
前戏
在之前我们对前端妹子传来的数据进行校验,使用的是序列化类来进行校验的,但这里面往往满足不了我们的需求,更多的时候我们希望自己定义校验规则。这里介绍三种自定义校验的方式。分别是单一字段校验,多个字段校验,还有就是自定义校验
单一字段校验
在序列化器BookSerializer自定义一个方法
class BookSerializer(serializers.Serializer): id = serializers.IntegerField(required=False) # 只序列化,不走校验 title = serializers.CharField(max_length=32, validators=[my_validate]) pub_time = serializers.DateField() category = serializers.CharField(source="get_category_display", read_only=True) # 只序列化用 # 因为前端传的是数字,所以需要重写 post_category = serializers.IntegerField(write_only=True) # 只反序列化用 publisher = PublisherSerializer(read_only=True) # 一对多的表 只序列化用 authors = AuthorSerializer(many=True, read_only=True) # 多对多的表需要指定many=True 只序列化用 publisher_id = serializers.IntegerField(write_only=True) # 只反序列化用 author_list = serializers.ListField(write_only=True) # 只反序列化用 def create(self, validated_data): 。。。
def validate_title(self, value): # 对单一字段校验 if "BDYJY" not in value.upper(): return value raise serializers.ValidationError('标题里含有非法字符') # 抛出错误
validate_字段名,这里validate_title,表示只对title字段进行校验,其他的字段不校验
这样当我们传的值有bdyjy时会提示非法,如下
多个字段校验
上面的校验是校验某一个字段的,有时候我们想校验多个字段,这时候就要用到validate这个方法了
class BookSerializer(serializers.Serializer): id = serializers.IntegerField(required=False) # 只序列化,不走校验 title = serializers.CharField(max_length=32) pub_time = serializers.DateField() category = serializers.CharField(source="get_category_display", read_only=True) # 只序列化用 # 因为前端传的是数字,所以需要重写 post_category = serializers.IntegerField(write_only=True) # 只反序列化用 publisher = PublisherSerializer(read_only=True) # 一对多的表 只序列化用 authors = AuthorSerializer(many=True, read_only=True) # 多对多的表需要指定many=True 只序列化用 publisher_id = serializers.IntegerField(write_only=True) # 只反序列化用 author_list = serializers.ListField(write_only=True) # 只反序列化用 def create(self, validated_data): ... def validate(self, attrs): # 对多个字段校验 # attrs是一个字典,里面是传过来的所有字段 if 'python' in attrs['title'].lower() and attrs['post_category']==1: return attrs else: raise serializers.ValidationError('传的参数有误,请重新上传')
结果:
自定义校验
上面的两种校验要么是单一字段校验,要么是所有字段校验,但更多的时候,我们是想让某些字段校验这个,某些字段校验那个,这时候,就要用到自定义校验了
前面的两种校验都是写在序列化器类里面的,自定义校验要写在序列化类外面,哪个字段想用就写上validators参数,里面是一个列表,放自定义的方法名
def my_validate(value): # 自定义校验 if "sb" in value.lower(): raise serializers.ValidationError('有脏话') return value
在序列化器里
class BookSerializer(serializers.Serializer): id = serializers.IntegerField(required=False) # 只序列化,不走校验 title = serializers.CharField(max_length=32, validators=[my_validate]) # validators里传的是一个列表,里面的是自定义的方法名 pub_time = serializers.DateField() category = serializers.CharField(source="get_category_display", read_only=True) # 只序列化用
这样哪个字段需要使用自定义的校验规则了就给哪个字段加上validators参数,里面放上要校验的方法名就可以了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)