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类定义的讲解
Nov 01 Python
python 多进程通信模块的简单实现
Feb 20 Python
Python中正则表达式的详细教程
Apr 30 Python
python 字典(dict)按键和值排序
Jun 28 Python
python 同时读取多个文件的例子
Jul 16 Python
通过python3实现投票功能代码实例
Sep 26 Python
python实现高斯(Gauss)迭代法的例子
Nov 20 Python
python实现图片插入文字
Nov 26 Python
使用python去除图片白色像素的实例
Dec 12 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
详解Python 最短匹配模式
Jul 29 Python
教你使用TensorFlow2识别验证码
Jun 11 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实现中文字符截取防乱码方法汇总
2015/04/29 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
php array_chunk()函数用法与注意事项
2019/07/12 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
2014/01/26 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
jQuery HTML css()方法与css类实例详解
2020/05/20 jQuery
[56:20]LGD vs VP Supermajor 败者组决赛 BO3 第三场 6.10
2018/07/04 DOTA
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python 获取et和excel的版本号
2009/04/09 Python
详解Python中expandtabs()方法的使用
2015/05/18 Python
举例讲解Python设计模式编程中的访问者与观察者模式
2016/01/26 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
2019/06/24 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
英国演唱会订票网站:Ticket Selection
2018/03/27 全球购物
《罗布泊,消逝的仙湖》教学反思
2014/03/01 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
建筑施工安全责任书
2014/07/24 职场文书
学生自我评语
2015/01/04 职场文书
2015年学生会个人工作总结
2015/04/09 职场文书
企业投资意向书
2015/05/09 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android