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 self,cls,decorator的理解
Jul 13 Python
python检测lvs real server状态
Jan 22 Python
Python统计列表中的重复项出现的次数的方法
Aug 18 Python
python设计模式大全
Jun 27 Python
python爬取NUS-WIDE数据库图片
Oct 05 Python
使用Kivy将python程序打包为apk文件
Jul 29 Python
浅谈numpy数组的几种排序方式
Dec 15 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
Apr 02 Python
Flask 上传自定义头像的实例详解
Jan 09 Python
python爬虫实例之获取动漫截图
May 31 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 Python
神经网络训练采用gpu设置的方式
Mar 03 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
PHP项目开发中最常用的自定义函数整理
2010/12/02 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
php微信开发接入
2016/08/27 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
HR vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
JavaScript表单通过正则表达式验证电话号码
2014/03/14 Javascript
js中运算符&amp;&amp; 和 || 的使用记录
2014/08/21 Javascript
判断浏览器的内核及版本号方法汇总
2015/01/05 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
AngularJS2中一种button切换效果的实现方法(二)
2017/03/27 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
微信小程序实现表单校验功能
2020/03/30 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
vue模仿网易云音乐的单页面应用
2019/04/24 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
浅谈python连续赋值可能引发的错误
2018/11/10 Python
简单了解Django ORM常用字段类型及参数配置
2020/01/07 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
如何在Python对Excel进行读取
2020/06/04 Python
python能开发游戏吗
2020/06/11 Python
python实现canny边缘检测
2020/09/14 Python
2019年Java面试必问之经典试题
2012/09/12 面试题
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
演讲稿开场白
2014/01/13 职场文书
小学信息技术教学反思
2014/02/10 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
城管个人总结
2015/02/28 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
毕业论文致谢词
2015/05/14 职场文书
寒假致家长的一封信
2015/10/10 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技