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模拟登陆淘宝并统计淘宝消费情况的代码实例分享
Jul 04 Python
python放大图片和画方格实现算法
Mar 30 Python
用Python一键搭建Http服务器的方法
Jun 01 Python
Python实现的tcp端口检测操作示例
Jul 24 Python
[原创]Python入门教程5. 字典基本操作【定义、运算、常用函数】
Nov 01 Python
python 函数内部修改外部变量的方法
Dec 18 Python
python实现彩色图转换成灰度图
Jan 15 Python
Django外键(ForeignKey)操作以及related_name的作用详解
Jul 29 Python
如何用Python来搭建一个简单的推荐系统
Aug 07 Python
Python实现多线程/多进程的TCP服务器
Sep 03 Python
Python对wav文件的重采样实例
Feb 25 Python
Pycharm中配置远程Docker运行环境的教程图解
Jun 11 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 日,周,月点击排行统计
2012/01/11 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
三种php连接access数据库方法
2013/11/11 PHP
实例讲解php数据访问
2016/05/09 PHP
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
Javascript 按位与赋值运算符 (&amp;=)使用介绍
2014/02/04 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
2016/05/17 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
2016/09/28 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
[02:04]完美世界城市挑战赛秋季赛报名开始 谁是solo路人王?
2019/10/10 DOTA
Python实现求解一元二次方程的方法示例
2018/06/20 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
python speech模块的使用方法
2020/09/09 Python
Python tkinter实现日期选择器
2021/02/22 Python
详解CSS3的opacity属性设置透明效果的用法
2016/05/09 HTML / CSS
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
Ibatis如何调用存储过程
2015/05/15 面试题
精伦电子Java笔试题
2013/01/16 面试题
财务经理岗位职责
2013/11/09 职场文书
大学生两会精神学习心得体会
2014/03/10 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
单位委托书怎么写
2014/09/21 职场文书
万里长城导游词
2015/01/30 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
MySQL如何解决幻读问题
2021/08/07 MySQL