当前位置:   article > 正文

DRF序列化和反序列化——数据验证进阶_drf validi

drf validi

数据验证

本文上接DRF序列化和反序列化——基本使用,如果不了解DRF中序列化和反序列化,请先阅读前文。

反序列化数据验证进阶

首先,后端一定是不相信前端传来的数据的。因此,我们之前使用is_valid()方法进行数据的验证,但是这还不够。因为is_valid()只是对字段的类型,长度,最大值,最小值等进行验证。在实际开发中,我们还需要对字段的内容进行验证。例如:使用书籍的id进行查询,id应该是个数字,不应该包含其他内容。我们对id作以限制,就能避免可能存在的ORM注入等风险。因此我们需要定制化is_valid验证。

单字段验证

在序列化器中定义方法validate_name来实现对name字段的进一步自定义验证。如果需要对一个字段进行自定义验证,可以定义名为validate_字段名的方法来实现。

def validate_name(self, name):
    rule = re.compile(r"^[A-Za-z]{1,10}$")
    result = rule.search(name)
    if not result:
        raise serializers.ValidationError('name只能是英文字母,并且为1-10位')	# 数据有问题,抛出异常
    
    return name		# 数据没问题,返回数据。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

通过自定义字段规定书籍名称只能是英文字母,并且是1-10位。进行POST请求(增加请求)。

下面使用错误数据进行请求
在这里插入图片描述
后端返回400状态码,返回的提示信息中包含了字段名称name以及我们写在序列化ValidationError异常中的提示。

下面使用正确数据进行请求
在这里插入图片描述

多字段验证

有时候,我们需要进行多字段之间的验证,例如密码和重复密码,我们希望这两者是相等的。上面的单字段验证是做不到的。不过DRF提供了不带字段名称的validate方法可以进行多字段验证。下面,我们先修改试图类中的POST方法为如下所示:

def post(self, request, *args, **kwargs):
    """新增书籍"""
    json_data = json.loads(request.body)
    pub_date = json_data.get('pub_date')
    name = json_data.get('name')
    # 反序列化
    obj = BookInfoSerializer(data={"name":name, "pub_date": pub_date, "readcount": 0, "commentcount": 10})
    # 使用is_valid()进行验证
    if obj.is_valid():
        # 使用save进行保存
        obj.save()
        return JsonResponse(obj.data)
    else:
        # 序列化器对象的errors属性获取字典形式的错误信息
        return JsonResponse(data=obj.errors, status=400)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

序列化器中新增方法validate()如下所示:

def validate(self, attrs):  
    """attrs是数据字典"""
    
    # 获取数据
    readcount = attrs.get('readcount', 0)
    commentcount = attrs.get('commentcount', 0)

    if readcount == 0 and commentcount != 0:   
        raise serializers.ValidationError("阅读量为0时,不可能有评论")
    
    return attrs    # 返回数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

进行请求,结果如下所示:
在这里插入图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号