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的垃圾回收机制深入分析
Jul 16 Python
Python3.2中Print函数用法实例详解
May 19 Python
python如何获取服务器硬件信息
May 11 Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 Python
Python tkinter事件高级用法实例
Jan 31 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
Python使用pyautocad+openpyxl处理cad文件示例
Jul 11 Python
python打造爬虫代理池过程解析
Aug 15 Python
详解python列表(list)的使用技巧及高级操作
Aug 15 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
Selenium webdriver添加cookie实现过程详解
Aug 12 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 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中将数组转成XML格式的实现代码
2011/08/08 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
php计算整个目录大小的方法
2015/06/01 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
apache集成php7.3.5的详细步骤
2019/06/20 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
2019/10/17 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
jQuery EasyUI API 中文文档 - Draggable 可拖拽
2011/09/29 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
浅谈Webpack 是如何加载模块的
2018/05/24 Javascript
详解使用create-react-app添加css modules、sasss和antd
2018/07/31 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
Angular父子组件通过服务传参的示例方法
2018/10/31 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
easy_install python包安装管理工具介绍
2013/02/10 Python
python基于paramiko将文件上传到服务器代码实现
2019/07/08 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
html2canvas生成的图片偏移不完整的解决方法
2020/05/19 HTML / CSS
几个判断型的面试题
2012/07/03 面试题
工程专业求职自荐书范文
2014/02/18 职场文书
合作协议书怎么写
2014/04/18 职场文书
工作收入住址证明
2014/10/28 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
2015年度物流工作总结
2015/04/30 职场文书
2015年七七事变78周年纪念活动方案
2015/05/06 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
婚宴主持词
2015/06/30 职场文书