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 相关文章推荐
pyqt4教程之messagebox使用示例分享
Mar 07 Python
python嵌套函数使用外部函数变量的方法(Python2和Python3)
Jan 31 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
Python3 使用cookiejar管理cookie的方法
Dec 28 Python
对python列表里的字典元素去重方法详解
Jan 21 Python
使用Python快速制作可视化报表的方法
Feb 03 Python
jupyter note 实现将数据保存为word
Apr 14 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
Jun 10 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
详解python字符串驻留技术
May 21 Python
Python图片验证码降噪和8邻域降噪
Aug 30 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 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
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
2007/08/19 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
2016/03/04 PHP
html+javascript实现可拖动可提交的弹出层对话框效果
2013/08/05 Javascript
php中给js数组赋值方法
2014/03/10 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
2019/07/16 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
2019/08/02 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
解决python3 json数据包含中文的读写问题
2018/05/10 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
python实现简单坦克大战
2020/03/27 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
python中四舍五入的正确打开方式
2021/01/18 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
耐克亚太地区:Nike APAC
2019/12/07 全球购物
学生宿舍管理制度
2014/01/30 职场文书
竞选副班长演讲稿
2014/04/24 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
行风评议整改报告
2014/11/06 职场文书
2014年公务员转正工作总结
2014/11/07 职场文书
转变工作作风心得体会
2016/01/23 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android