zhangjiahao996
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)

 

分类:

技术点:

相关文章: