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 相关文章推荐
Windows8下安装Python的BeautifulSoup
Jan 22 Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
Linux下将Python的Django项目部署到Apache服务器
Dec 24 Python
python 基础教程之Map使用方法
Jan 17 Python
python生成excel的实例代码
Nov 08 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 Python
解决pycharm无法调用pip安装的包问题
May 18 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
python求加权平均值的实例(附纯python写法)
Aug 22 Python
Python 防止死锁的方法
Jul 29 Python
python工具dtreeviz决策树可视化和模型可解释性
Mar 03 Python
分享几种python 变量合并方法
Mar 20 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实现C#山寨ArrayList的方法
2015/07/16 PHP
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
UpdatePanel和Jquery冲突的解决方法
2013/04/01 Javascript
js Date概念详细介绍
2013/11/22 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
详解javascript数组去重问题
2015/11/06 Javascript
js点击任意区域弹出层消失实现代码
2016/12/27 Javascript
Nginx 配置多站点vhost 的方法
2018/01/07 Javascript
NW.js 简介与使用方法
2018/02/01 Javascript
webpack4 入门最简单的例子介绍
2018/09/05 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
vue使用echarts图表的详细方法
2018/10/22 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
Python 加密的实例详解
2017/10/09 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
关于python中密码加盐的学习体会小结
2019/07/15 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
python 实现批量替换文本中的某部分内容
2019/12/13 Python
python操作yaml说明
2020/04/08 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
幼儿园毕业典礼主持词
2014/03/21 职场文书
《穷人》教学反思
2014/04/08 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
新店开张宣传语
2015/07/13 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL
js中Object.create实例用法详解
2021/10/05 Javascript