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执行get提交的方法
Apr 29 Python
Python设置Socket代理及实现远程摄像头控制的例子
Nov 13 Python
python模块之paramiko实例代码
Jan 31 Python
python3.4实现邮件发送功能
May 28 Python
python3爬虫之设计签名小程序
Jun 19 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
python list多级排序知识点总结
Oct 23 Python
python/Matplotlib绘制复变函数图像教程
Nov 21 Python
如何用 Python 处理不平衡数据集
Jan 04 Python
Python如何把不同类型数据的json序列化
Apr 30 Python
Python并发编程实例教程之线程的玩法
Jun 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实现监控varnish缓存服务器的状态
2014/12/30 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
PHP排序算法之堆排序(Heap Sort)实例详解
2018/04/21 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
Javascript模板技术
2007/04/27 Javascript
认识延迟时间为0的setTimeout
2008/05/16 Javascript
javascript 面向对象编程 万物皆对象
2009/09/17 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
批量修改标签css样式以input标签为例
2014/07/31 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
AngularJS 中的Promise --- $q服务详解
2016/09/14 Javascript
bootstrap中的 form表单属性role=&quot;form&quot;的作用详解
2017/01/20 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
JS集合set类的实现与使用方法示例
2019/02/01 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
js+cavans实现图片滑块验证
2020/09/29 Javascript
python动态参数用法实例分析
2015/05/25 Python
Django验证码的生成与使用示例
2017/05/20 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
python实现识别手写数字 python图像识别算法
2020/03/23 Python
mac 安装python网络请求包requests方法
2018/06/13 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
Python视频编辑库MoviePy的使用
2020/04/01 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
车间机修工岗位职责
2014/02/28 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
保护环境标语
2014/06/09 职场文书
老员工辞职信范文
2015/05/12 职场文书
千与千寻观后感
2015/06/04 职场文书