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 学习笔记
Dec 27 Python
python正则表达式修复网站文章字体不统一的解决方法
Feb 21 Python
Python中文件操作简明介绍
Apr 13 Python
django实现分页的方法
May 26 Python
实例Python处理XML文件的方法
Aug 31 Python
python开发中module模块用法实例分析
Nov 12 Python
Python读大数据txt
Mar 28 Python
python dict.get()和dict['key']的区别详解
Jun 30 Python
python3 实现一行输入,空格隔开的示例
Nov 14 Python
Python实现统计英文文章词频的方法分析
Jan 28 Python
pycharm双击无响应(打不开问题解决办法)
Jan 10 Python
python 进制转换 int、bin、oct、hex的原理
Jan 13 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 远程图片保存到本地的函数类
2008/12/08 PHP
PHP 高级课程笔记 面向对象
2009/06/21 PHP
php实现短信发送代码
2015/07/05 PHP
PHP中使用curl伪造IP的简单方法
2015/08/07 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
常用的javascript function代码
2008/05/23 Javascript
extjs DataReader、JsonReader、XmlReader的构造方法
2009/11/07 Javascript
基于jQuery的倒计时插件代码
2011/05/07 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
Python深入学习之装饰器
2014/08/31 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
Python中Collections模块的Counter容器类使用教程
2016/05/31 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
在VS Code上搭建Python开发环境的方法
2018/04/06 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
python多线程并发实例及其优化
2019/06/27 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
详细分析Python垃圾回收机制
2020/07/01 Python
Python如何使用ConfigParser读取配置文件
2020/11/12 Python
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
新闻专业推荐信范文
2013/11/20 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
食堂个人先进事迹
2014/01/22 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
母亲节演讲稿
2014/05/27 职场文书
思想政治表现评语
2015/01/04 职场文书
防震减灾主题班会
2015/08/14 职场文书
《绝招》教学反思
2016/02/20 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏