Django 序列化中的局部钩子和全局钩子

局部钩子

     给某个字段再增加校验(固定用法),定义一个方法,格式为 validate_字段名
from rest_framework.exceptions import ValidationError # 认证失败

class UserModelSerializer(serializers.ModelSerializer)

    class Meta:
        model = User
        fields = '__all__'
        
        extra_kwargs = {    # 配置字段参数
            'username':{'read_only':True}
            'addr':{'max_length':16,'min_length':1,validators:[函数内存地址]}  # validators作用: 字段先校验自己的,最大长度最小长度,然后校验[]中的函数,它会触发这个函数,并且把字段传入函数里,这个函数校验不通过也会抛异常 
        }
        
        # 限制addr,不能以dsb开头
        def validate_addr(self,a_data):

            if a_data.startswith('dsb')
                # 抛异常,不能以dsb开头
                raise ValidationError('不能以dsb开头')  # 以dsb开头没有报错,因为在APIView里捕获了全局异常,处理了,尽管抛异常,不会报错
            else:
                return a_data

# validators 与 validate_addr 的区别: validate_addr 只能用在addr字段上,而validators能用在addr、username等其他字段上  

全局钩子

# 限制用户的名字不能等于用户的地址
# 如果写局部钩子不能限制住,因为局部钩子只能拿一条数据即只能限制名字或者只能拿到地址,不能同时拿到名字和地址,所以需要全局钩子(固定写法)定义一个方法validate

def validate(self, attrs):  # attrs 接收到所有字段数据
    name = attrs.get('username')
    addr = attrs.get('addr')
    if name == addr:
        raise ValidationError('name和addr不能一样')
    else:
        return attrs 

上一篇:将本地已有仓库推送到github上新建的空仓库(git remote add ...)


下一篇:LWIP学习笔记-链路层