框架之反序列化请求数据的校验
序列化与反序列化
- 序列化: GET
反序列化:PUT、PATCH、POST
反序列化的数据校验
数据校验方式有三种:直接在字段中添加属性的方式来进行校验
class UserInfoSerializer2(serializers.Serializer): username = serializers.CharField(max_length=10, error_messages ={'required': '标题不能为空', 'max_length': "用户名不能超过10位"}) password = serializers.CharField(max_length=15, error_messages = {'required': '密码不能为空', 'max_length': '密码不能超过15位'})
在接收到request穿过来的数据后,在序列化类中创建校验的类方法来进行校验
class UserInfoSerializer2(serializers.Serializer): username = serializers.CharField(max_length=10, error_messages ={'required': '标题不能为空', 'max_length': "用户名不能超过10位"}) password = serializers.CharField(max_length=15, error_messages = {'required': '密码不能为空', 'max_length': '密码不能超过15位'}) def validate(self, data_dict): username = data_dict.get('username') # data_dict不能加self password = data_dict.get('password') if username == '李志': raise serializers.ValidationError("用户名已注册") if password == 'bl130310': raise serializers.ValidationError("密码重复") return data_dict
Note
data_dict是在实例化序列化类是接收到的数据,当通过类方法校验完成的数据,必须把数据返回。在序列化类外创建校验函数来进行校验,函数通过在字段中添加validators=[校验函数1, 校验函数2]的方式接收,并且只写函数名,不加括号和参数
def checkusername(username): # 这里需要写校验的字段名 message = "用户名重复" if username == '李志': raise serializers.ValidationError(message) class UserInfoSerializer2(serializers.Serializer): username = serializers.CharField(max_length=10, error_messages ={'required': '标题不能为空', 'max_length': "用户名不能超过10位"}, validators=[checkusername]) password = serializers.CharField(max_length=15, error_messages = {'required': '密码不能为空', 'max_length': '密码不能超过15位'}) def validate(self, data_dict): username = data_dict.get('username') password = data_dict.get('password') if username == '李志': raise serializers.ValidationError("用户名已注册") if password == 'bl130310': raise serializers.ValidationError("密码重复") return data_dict class Meta: model = UserInfo fields = ['username', 'password']