DRF之字段验证
字段验证一般在反序列化时会有,即接收客户端传送过来的数据,进行验证,再进行保存
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 排除字段的校验。

浙公网安备 33010602011771号