class StudentSerizlizer(serializers.Serializer): name = serializers.CharField(max_length=4,validators=[check666,]) age = serializers.IntegerField(max_value=18) class_null = serializers.CharField() description = serializers.CharField(allow_blank=True) # 局部钩子:针对单个属性对应的数据进行校验 def validate_name(self,val): #validata_+需要校验的属性名(固定写法) if \'777\' in val: raise serializers.ValidationError(\'不能有777\') return val # 全局钩子: 主要是针对多个属性数据进行校验 def validate(self,data): print(data) #OrderedDict([(\'name\', \'c778\'), (\'age\', 6), (\'class_null\', \'1\'), (\'description\', \'123\')]) age = data.get(\'age\') class_null = data.get(\'age\') if age == class_null: raise serializers.ValidationError(\'age和class——null不能相等\') return data #如果没有错误,全局钩子要return所有数据
视图
def post(self,request): print(request.POST) data = { \'name\':request.POST.get(\'name\'), \'age\':request.POST.get(\'age\'), \'class_null\':request.POST.get(\'class_null\'), \'description\':request.POST.get(\'description\'), } ser = StudentSerizlizer(data=data) if ser.is_valid(): print(request.body) ret = models.Student.objects.create( **ser.validated_data ) serializer = StudentSerizlizer(instance=ret) print(serializer.data) #得到的是校验成功之后的所有正确数据 return JsonResponse(serializer.data,safe=False,json_dumps_params={\'ensure_ascii\':False}) # return JsonResponse({\'xx\':\'xx\'}) else: return JsonResponse({\'error\':\'有字段错误\'})
执行顺序
# 1.is_valid()方法时,先校验序列化器类中的所有属性Field(CharField(参数))参数对应的校验规则 # 2.再执行局部钩子 # 举例:比如有name和age两个属性,先执行name 的参数校验,在执行name的局部钩子(validate_name(self,val)),然后再执行age属性的参数校验,再执行age的局部钩子,最后所有属性的参数校验和局部钩子校验完成之后,执行全局钩子 # 3.最后执行全局钩子
raise_exception参数
默认等于flase等于True会主动抛异常
serializer.is_valid(raise_exception=True)