在drf框架中,我们很多的数据检验都是在序列化器中完成的,但是序列化器报错的信息就会很奇怪,所以我们最好是使用自己封装的序列化器来对报错信息进行封装,我是这样处理的
- 未处理之前:
{
"data": null,
"code": 1,
"message": {
"password": [
"请填写合法的整数值。"
]
}
}
- 处理之后:
{
"data": null,
"code": 1,
"message": "请填写合法的整数值。"
}
- 处理的代码
class ShiyanView(GenericAPIView):
"""实验"""
permission_classes = [IsAuthenticated, AdminUserPermission]
def post(self, request, *args, **kwargs):
data = request.data
serializer = ShiyanSerializer(data=data)
if not serializer.is_valid():
# {'password': [ErrorDetail(string='请填写合法的整数值。', code='invalid')]}
# {'username': [ErrorDetail(string='请确保这个字段至少包含 6 个字符。', code='min_length')],'password': [ErrorDetail(string='请填写合法的整数值。', code='invalid')]}
# {'username': [ErrorDetail(string='请确保这个字段至少包含 6 个字符。', code='min_length')]}
print('-----------------------')
print(serializer.errors)
# 对提示进行封装
message = str(serializer.errors)
start_string = message.find('string')
end_string = message.find('code')
a = message[start_string+8:end_string-3]
print(a)
return APIResponse.fail(message=a)
return APIResponse.success(message="充值成功")
class ShiyanSerializer(serializers.Serializer):
username = serializers.CharField(label='用户名', required=True, min_length=6, max_length=10)
password = serializers.IntegerField(label='密码', required=False)
def validate(self, attrs):
username = attrs['username']
password = attrs['password']
if not isinstance(password, int):
raise serializers.ValidationError({'password': '必须为整数'})
return attrs