DRF之字段验证
字段验证一般在反序列化时会有,即接收客户端传送过来的数据,进行验证,再进行保存
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | from rest_framework import serializers from teacher.models import Teacher # 字段验证函数(只能单个字段验证) def check_name(name): if name = = "xxx" : raise serializers.ValidationError( "用户名中含有敏感名称" ) return name # 字段验证函数(只能单个字段验证) def check_name2(name): if "666" in name: raise serializers.ValidationError( "用户名中不能有666" ) return name class TeacherSerializer(serializers.ModelSerializer): id = serializers.IntegerField(read_only = True ) # 设置read_only=True 可以忽略传过来的字段,不写入到数据库 name = serializers.CharField(max_length = 255 , required = True , validators = [check_name,check_name2]) # validators是个列表值,放入函数名可以从类体外引用函数进行验证,同时可以有多个函数验证 sex = serializers.BooleanField(required = True ) age = serializers.IntegerField(min_value = 1 , max_value = 100 , default = 18 ) description = serializers.IntegerField(write_only = True ) # 从数据库读出来的数据,序列化返回出来的时候,不显示某个字段,可以设置write_only=True # 字段验证方法 # validate_字段名() # 验证单个字段 # validate() # 验证所有字段 def validate_name( self , name): exists = Teacher.objects. filter (name = name).exists() if exists: raise serializers.ValidationError( "姓名不能重复" ) # 注意,每次验证完成以后必须有结果返回!否则数据就会丢失 return name def validate( self , attrs): if attrs.get( "name" ) = = "乾隆" and attrs.get( "sex" ) = = True : raise serializers.ValidationError( "别闹" ) return attrs class Meta: model = Teacher fields = "__all__" # exclude = ["字段名"] # 如果某个字段我们既不希望用户传到数据库,也不希望查询的时候显示给用户,那么可以用 exclude 排除字段的校验。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通