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学习笔记_数据排序方法
May 22 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 Python
Windows下为Python安装Matplotlib模块
Nov 06 Python
Python iter()函数用法实例分析
Mar 17 Python
python实现弹窗祝福效果
Apr 07 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
python中调试或排错的五种方法示例
Sep 12 Python
Python使用configparser库读取配置文件
Feb 22 Python
使用keras内置的模型进行图片预测实例
Jun 17 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 Python
python 对xml解析的示例
Feb 27 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
ThinkPHP学习笔记(一)ThinkPHP部署
2014/06/22 PHP
PHP与服务器文件系统的简单交互
2016/10/21 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
分析Node.js connect ECONNREFUSED错误
2013/04/09 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
浅析JS原型继承与类的继承
2016/04/07 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
2015/10/18 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
python 利用for循环 保存多个图像或者文件的实例
2018/11/09 Python
Python线性拟合实现函数与用法示例
2018/12/13 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
python中matplotlib实现随鼠标滑动自动标注代码
2020/04/23 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
html5中使用hotcss.js实现手机端自适配的方法
2020/04/23 HTML / CSS
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
ktv总经理岗位职责
2014/02/17 职场文书
事假请假条范文
2014/04/11 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
2015小学教师德育工作总结
2015/05/12 职场文书
医院中层管理人员培训心得体会
2016/01/11 职场文书
python爬虫之爬取笔趣阁小说
2021/04/22 Python
mysql分表之后如何平滑上线详解
2021/11/01 MySQL