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的web.py框架中url的设定方法
Jul 11 Python
python魔法方法-属性访问控制详解
Jul 25 Python
wxpython实现图书管理系统
Mar 12 Python
Django 根据数据模型models创建数据表的实例
May 27 Python
Python告诉你木马程序的键盘记录原理
Feb 02 Python
Pandas之ReIndex重新索引的实现
Jun 25 Python
python算法题 链表反转详解
Jul 02 Python
Python如何基于rsa模块实现非对称加密与解密
Jan 03 Python
在keras中model.fit_generator()和model.fit()的区别说明
Jun 17 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
Jun 22 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
Python中三种花式打印的示例详解
Mar 19 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通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
PHP中常见的密码处理方式和建议总结
2018/10/14 PHP
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
基于jquery实现的鼠标拖拽元素复制并写入效果
2011/08/23 Javascript
cookie的复制与使用记住用户名实现代码
2013/11/04 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
2015/08/22 Javascript
不得不分享的JavaScript常用方法函数集(下)
2015/12/25 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
JavaScript_object基础入门(必看篇)
2016/06/13 Javascript
vue如何使用 Slot 分发内容实例详解
2017/09/05 Javascript
jquery-ui 进度条功能示例【测试可用】
2019/07/25 jQuery
Vue分页效果与购物车功能
2019/12/13 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
如何利用python进行时间序列分析
2020/08/04 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
PyCharm最新激活码PyCharm2020.2.3有效
2020/11/18 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
计算机相关的自我评价
2014/01/15 职场文书
个人租房协议书
2014/11/28 职场文书
导游词300字
2015/02/13 职场文书
超市督导岗位职责
2015/04/10 职场文书
贷款收入证明范本
2015/06/12 职场文书
七年级英语教学反思
2016/02/15 职场文书
基于Python的EasyGUI学习实践
2021/05/07 Python
嵌入式Redis服务器在Spring Boot测试中的使用教程
2021/07/21 Redis
js判断两个数组相等的5种方法
2022/05/06 Javascript
JS函数式编程实现XDM一
2022/06/16 Javascript