赞
踩
本文上接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-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)
序列化器中新增方法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 # 返回数据
进行请求,结果如下所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。