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中for循环的使用方法
May 14 Python
python处理按钮消息的实例详解
Jul 11 Python
Python内存管理方式和垃圾回收算法解析
Nov 11 Python
PyCharm代码整体缩进,反向缩进的方法
Jun 25 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
Python File(文件) 方法整理
Feb 18 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
Python 生成VOC格式的标签实例
Mar 10 Python
在主流系统之上安装Pygame的方法
May 20 Python
Python创建临时文件和文件夹
Aug 05 Python
解决Python 函数声明先后顺序出现的问题
Sep 02 Python
Python一行代码实现自动发邮件功能
May 30 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抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
使用PHPMailer实现邮件发送代码分享
2014/10/23 PHP
PHP制作用户注册系统
2015/10/23 PHP
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
JQuery的ajax获取数据后的处理总结(html,xml,json)
2010/07/14 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
Vue项目中设置背景图片方法
2018/02/21 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
python访问sqlserver示例
2014/02/10 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
python实现简单名片管理系统
2018/11/30 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
使用Python将Mysql的查询数据导出到文件的方法
2019/02/25 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
Python2 与Python3的版本区别实例分析
2020/03/30 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
Python如何进行时间处理
2020/08/06 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
python map比for循环快在哪
2020/09/21 Python
大专计算机个人求职的自我评价
2013/10/21 职场文书
大学生交通专业求职信
2014/09/01 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js