首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >DRF序列化和反序列化——数据验证进阶

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

作者头像
zy010101
发布2021-12-07 16:57:55
发布2021-12-07 16:57:55
1K0
举报
文章被收录于专栏:程序员程序员

数据验证

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

反序列化数据验证进阶

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

单字段验证

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

代码语言:javascript
复制
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-10位。进行POST请求(增加请求)。

下面使用错误数据进行请求

后端返回400状态码,返回的提示信息中包含了字段名称name以及我们写在序列化ValidationError异常中的提示。

下面使用正确数据进行请求

多字段验证

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

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
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    # 返回数据

进行请求,结果如下所示:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/11/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据验证
    • 反序列化数据验证进阶
      • 单字段验证
      • 多字段验证
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档