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获取本机外网ip的方法
Apr 15 Python
Python 装饰器使用详解
Jul 29 Python
Numpy掩码式数组详解
Apr 17 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
python+splinter实现12306网站刷票并自动购票流程
Sep 25 Python
python 插入日期数据到Oracle实例
Mar 02 Python
matplotlib quiver箭图绘制案例
Apr 17 Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 Python
Python解析m3u8拼接下载mp4视频文件的示例代码
Mar 03 Python
Python数据分析之pandas读取数据
Jun 02 Python
Python深度学习之实现卷积神经网络
Jun 05 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中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
php在linux下检测mysql同步状态的方法
2015/01/15 PHP
PHP连接MSSQL方法汇总
2016/02/05 PHP
php实现自定义中奖项数和概率的抽奖函数示例
2017/05/26 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
jQuery(1.3.2) 7行代码搞定跟随屏幕滚动的层
2009/05/21 Javascript
jquery ready()的几种实现方法小结
2010/06/18 Javascript
javascript自适应宽度的瀑布流实现思路
2013/02/20 Javascript
Yii-自定义删除确认弹框(zyd)jquery实现代码
2013/03/04 Javascript
css与javascript跨浏览器兼容性总结
2014/09/15 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
一系列Bootstrap导航条使用方法分享
2016/04/29 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
React中this丢失的四种解决方法
2019/03/12 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python中的super用法详解
2015/05/28 Python
Python遍历文件夹和读写文件的实现方法
2017/05/10 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
pycharm 2019 最新激活方式(pycharm破解、激活)
2020/09/22 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
纯CSS3实现漂亮的input输入框动画样式库(Text input love)
2018/12/29 HTML / CSS
JD Sports芬兰:英国领先的运动鞋和运动服饰零售商
2018/11/16 全球购物
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
家庭教育的心得体会
2014/09/01 职场文书
教师个人事迹材料
2014/12/17 职场文书
大雁塔导游词
2015/02/04 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
2015年保险公司内勤工作总结
2015/05/23 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
资产移交协议书
2016/03/24 职场文书
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android