Python基于Serializer实现字段验证及序列化


Posted in Python onNovember 04, 2020

自带验证器

1、UniqueValidator

用于验证(唯一)unique=True的字段,常用参数:

  • queryset: required,用于明确验证唯一性集合,必须设置
  • message:当验证失败时的提示信息
from rest_framework.validators import UniqueValidator
slug = SlugField(
  max_length=100,
  validators=[UniqueValidator(queryset=BlogPost.objects.all())]
)

2、 UniqueTogetherValidator

  • queryset:required,用于明确验证唯一性集合,必须设置
  • fields: required,字段列表或者元组,字段必须是序列化类中存在的字段
  • message:当验证失败时的提示信息
  • UniqueTogetherValidator有一个隐性要求就是验证的字段必须要提供值,除非设置了一个默认值
from rest_framework.validators import UniqueTogetherValidator

class ExampleSerializer(serializers.Serializer):
  class Meta:
    validators = [
      UniqueTogetherValidator(
        queryset=ToDoItem.objects.all(),
        fields=('list', 'position')
      )
    ]

3、serializer 返回字段定义

# 所有字段。attrs是字段验证合法之后返回的总的dict
  def validate(self, attrs):
    #前端没有传mobile值到后端,这里添加进来
    attrs["mobile"] = attrs["username"]
    #code是自己添加得,数据库中并没有这个字段,验证完就删除掉
    del attrs["code"]
    return attrs

4、自定义字段验证格式validate_<field_name>,返回的是验证字段的值或是serializers.ValidationError

class MobileVerifySerializer(serializers.ModelSerializer):

  #CareerUser中没有code字段,这里需要自定义一个code序列化字段
  code = serializers.CharField(required=True, write_only=True, max_length=4, min_length=4,
                 error_messages={
                    "blank": "请输入验证码",
                    "required": "请输入验证码",
                    "max_length": "验证码格式错误",
                    "min_length": "验证码格式错误"
                 },
                help_text="验证码")
  #验证用户名是否存在
  username = serializers.CharField(label="用户名", help_text="用户名", required=True, allow_blank=False,
                   validators=[UniqueValidator(queryset=CareerUser.objects.all(), message="用户已经存在")])

  #验证code
  def validate_code(self, code):
    # 用户注册,已post方式提交注册信息,post的数据都保存在initial_data里面
    #username就是用户注册的手机号,验证码按添加时间倒序排序,为了后面验证过期,错误等
    verify_records = VerifyCode.objects.filter(mobile=self.initial_data["username"]).order_by("-add_time")

    if verify_records:
      # 最近的一个验证码
      last_record = verify_records[0]
      # 有效期为五分钟。
      five_mintes_ago = datetime.now() - timedelta(hours=0, minutes=5, seconds=0)
      if five_mintes_ago > last_record.add_time:
        raise serializers.ValidationError("验证码过期")

      if last_record.code != code:
        raise serializers.ValidationError("验证码错误")

    else:
      raise serializers.ValidationError("验证码错误")

5、验证器

序列化程序上的各个字段可以包含验证程序,通过在字段实例上声明它们

def multiple_of_ten(value):
  if value % 10 != 0:
    raise serializers.ValidationError('Not a multiple of ten')

class GameRecord(serializers.Serializer):
  score = IntegerField(validators=[multiple_of_ten])
  ...

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中Genarator函数用法分析
Apr 08 Python
Python selenium 三种等待方式解读
Sep 15 Python
python实现requests发送/上传多个文件的示例
Jun 04 Python
pytorch 调整某一维度数据顺序的方法
Dec 08 Python
在Python中关于使用os模块遍历目录的实现方法
Jan 03 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
基于python实现查询ip地址来源
Jun 02 Python
Pytorch实现将模型的所有参数的梯度清0
Jun 24 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 Python
python反编译教程之2048小游戏实例
Mar 03 Python
Python简易开发之制作计算器
Apr 28 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 Python
pycharm使用技巧之自动调整代码格式总结
Nov 04 #Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 #Python
Python实现冒泡排序算法的完整实例
Nov 04 #Python
Lombok插件安装(IDEA)及配置jar包使用详解
Nov 04 #Python
基于OpenCV的路面质量检测的实现
Nov 04 #Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 #Python
python归并排序算法过程实例讲解
Nov 04 #Python
You might like
提升PHP执行速度全攻略(上)
2006/10/09 PHP
用PHP和ACCESS写聊天室(七)
2006/10/09 PHP
在JavaScript中调用php程序
2009/03/09 PHP
Windows7下PHP开发环境安装配置图文方法
2010/05/20 PHP
用PHP代码给图片加水印
2015/07/01 PHP
PHP实现的随机IP函数【国内IP段】
2016/07/20 PHP
php实现批量上传数据到数据库(.csv格式)的案例
2017/06/18 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
VBScript版代码高亮
2006/06/26 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
JavaScript模拟数组合并concat
2016/03/06 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
深入理解Angular4中的依赖注入
2017/06/07 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
javascript 高级语法之继承的基本使用方法示例
2019/11/11 Javascript
Vue中多元素过渡特效的解决方案
2020/02/05 Javascript
Python open读写文件实现脚本
2008/09/06 Python
Python里disconnect UDP套接字的方法
2015/04/23 Python
python机器学习之神经网络(一)
2017/12/20 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
Python和Bash结合在一起的方法
2020/11/13 Python
教师专业理论水平的自我评价分享
2013/11/09 职场文书
博士研究生自我鉴定范文
2013/12/04 职场文书
财务负责人任命书
2014/06/06 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
Windows server 2003卸载和安装IIS的图文教程
2022/07/15 Servers