热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DRF框架中Serializer反序列化验证机制详解:深入探讨Validators的应用与优化

在DRF框架的反序列化验证机制中,除了基本的字段类型和长度校验外,还常常需要进行更为复杂的条件限制校验。通过引入`validators`模块,可以实现自定义校验逻辑,如唯一字段校验等。本文将详细探讨`validators`的使用方法及其优化策略,帮助开发者更好地理解和应用这一重要功能。

  反序列化过程中,除了校验字段类型和长度大小之外,还需要有其它的条件限制的校验,这时我们可以使用validators自定义校验项


一、唯一字段校验

1.引入validators模块


from rest_framework import validators

2.在需要唯一校验的字段类里面设置validators字段的属性,值为一个列表,在列表里面添加唯一校验UniqueValidator,除了UniqueValidator的唯一校验,还有其它的唯一校验,根据不同的场景选择使用即可

技术分享图片

唯一校验UniqueValidator类一般接收两个参数,一个是queryset,需要传一个查询集,一个是message,为自定义的异常校验信息,代码如下:


from rest_framework import serializers
from rest_framework import validators
from .models import Projects
class ProjectSerializer(serializers.Serializer):
name
= serializers.CharField(max_length=200, label="项目名称", help_text=项目名称,
validators
=[validators.UniqueValidator(queryset=Projects.objects.all(), message="项目名字段name必须唯一")])
leader
= serializers.CharField(max_length=50, label="项目负责人", help_text=项目负责人)
programmer
= serializers.CharField(max_length=50, label="开发人员", help_text="开发人员")
tester
= serializers.CharField(max_length=50, label="测试人员", help_text="测试人员")

验证结果:

技术分享图片


二、自定义校验器函数

假设我们规定name字段不能包含字符“X”,我们可以在类的外面定义一个函数,这个函数需要给定一个形参,用来接收待校验的数据,并且指定条件下要抛出serializers.ValidationError的异常,如果validators字段值的列表中有多个校验规则,校验过程中会全部进行校验,并以列表的形式返回一组异常校验信息


from rest_framework import serializers
from rest_framework import validators
from .models import Projects
def name_is_not_contain_x(value):
if X in value.upper():
raise serializers.ValidationError("项目名字段name不能包含x的大小写字符")
class ProjectSerializer(serializers.Serializer):
name
= serializers.CharField(max_length=200, label="项目名称", help_text=项目名称,
validators
=[validators.UniqueValidator(queryset=Projects.objects.all(), message="项目名字段name必须唯一"),
name_is_not_contain_x],)
leader
= serializers.CharField(max_length=50, label="项目负责人", help_text=项目负责人)
programmer
= serializers.CharField(max_length=50, label="开发人员", help_text="开发人员")
tester
= serializers.CharField(max_length=50, label="测试人员", help_text="测试人员")

验证结果:

技术分享图片


三、自定义校验器方法

上面第二种采用的是在序列化器类外面创建的校验器函数,同样的也可以在类里面创建一个校验器方法,不同的有以下几点:



  • 方法名必须以validate_作为前缀,后缀为对应的字段名

  • 一定要返回校验之后的值

  • 不需要放在validators的列表中就可以生效


def validate_name(self, value):
if 项目 in value:
raise serializers.ValidationError("项目名称name字段不能包含‘项目’字符")
return value

验证结果:

技术分享图片


三、自定义多字段校验器方法



  • 上面我们都是单字段进行校验,如果是多字段同时进行校验,就需要用到该方法

  • 方法名固定为validate,形参固定为attrs

  • attrs返回一个QueryDict,字段名可以通过字典的方法进行取值,如:attrs[‘name‘]  或者 attrs.get(‘name‘)

  • 必须返回attrs

不需要放在validators的列表中就可以生效


def validate(self, attrs):
if ‘A in attrs.get(name) and ‘B in attrs.get(leader):
raise serializers.ValidationError("项目名称字段name不包含A的同时项目负责人字段leader也不能包含B")

验证结果:

技术分享图片

 我们可以看到该异常校验信息字段的key并不是我们想要的,接下来我们针对这个key进行修改

我们从DRF的源码settings.py模块中可以找到这个字段配置信息

技术分享图片

修改方法:在django项目下的settings.py模块中,修改REST_FRAMEWORK字典中的‘NON_FIELD_ERRORS_KEY‘的值即可


REST_FRAMEWORK = {
NON_FIELD_ERRORS_KEY: more_errors
}

验证结果:
技术分享图片


推荐阅读
  • 本文详细介绍了 jQuery 的入门知识与实战应用,首先讲解了如何引入 jQuery 库及入口函数的使用方法,为初学者提供了清晰的操作指南。此外,还深入探讨了 jQuery 在实际项目中的多种应用场景,包括 DOM 操作、事件处理和 AJAX 请求等,帮助读者全面掌握 jQuery 的核心功能与技巧。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
  • 本文深入探讨了 iOS 开发中 `int`、`NSInteger`、`NSUInteger` 和 `NSNumber` 的应用与区别。首先,我们将详细介绍 `NSNumber` 类型,该类用于封装基本数据类型,如整数、浮点数等,使其能够在 Objective-C 的集合类中使用。通过分析这些类型的特性和应用场景,帮助开发者更好地理解和选择合适的数据类型,提高代码的健壮性和可维护性。苹果官方文档提供了更多详细信息,可供进一步参考。 ... [详细]
  • iOS 设备唯一标识获取的高效解决方案与实践
    在iOS 7中,苹果公司再次禁止了对MAC地址的访问,使得开发者无法直接获取设备的物理地址。为了在开发过程中实现设备的唯一标识,苹果推荐使用Keychain服务来存储和管理唯一的标识符。此外,还可以结合其他技术手段,如UUID和广告标识符(IDFA),以确保设备的唯一性和安全性。这些方法不仅能够满足应用的需求,还能保护用户的隐私。 ... [详细]
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
  • 在Ubuntu系统中配置Python环境变量是确保项目顺利运行的关键步骤。本文介绍了如何将Windows上的Django项目迁移到Ubuntu,并解决因虚拟环境导致的模块缺失问题。通过详细的操作指南,帮助读者正确配置虚拟环境,确保所有第三方库都能被正确识别和使用。此外,还提供了一些实用的技巧,如如何检查环境变量配置是否正确,以及如何在多个虚拟环境之间切换。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • iOS开发中MVC架构模式的深入解析(第一部分)
    在iOS开发中,MVC架构模式是常用的设计模式之一。本文将深入解析MVC架构的第一部分,重点介绍View组件。View组件继承自UIView,主要负责内容的展示(如UILabel等视图类)和用户输入的处理(如UIButton等控件类)。通过详细的代码示例和实际应用,帮助开发者更好地理解和掌握View在MVC架构中的作用和实现方式。 ... [详细]
  • 优化升级版数据采集与赋值方法,专为前文内容设计
    在前一篇文章中,方法的局限性主要体现在需要传递参数,并且参数数量受限。当页面布局与所需参数不匹配时,该方法将无法正常工作。为此,我们推出了优化升级版1.1,旨在解决这些问题并提高灵活性和适用性。 ... [详细]
  • 通过整合JavaFX与Swing,我们成功地将现有的Swing应用程序组件进行了现代化改造。此次升级不仅提升了用户界面的美观性和交互性,还确保了与原有Swing应用程序的无缝集成,为开发高质量的Java桌面应用提供了坚实的基础。 ... [详细]
  • 如何在页面底部添加倾斜样式效果? ... [详细]
  • 使用 `git stash` 可以将当前未提交的修改保存到一个临时存储区,以便在后续恢复工作目录时使用。例如,在处理中间状态时,可以通过 `git stash` 命令将当前的所有未提交更改推送到一个新的储藏中,从而保持工作目录的整洁。此外,本文还将详细介绍如何解决 `git stash pop` 时可能出现的冲突问题,帮助用户高效地管理代码变更。 ... [详细]
  • 并发编程入门:初探多任务处理技术
    并发编程入门:探索多任务处理技术并发编程是指在单个处理器上高效地管理多个任务的执行过程。其核心在于通过合理分配和协调任务,提高系统的整体性能。主要应用场景包括:1) 将复杂任务分解为多个子任务,并分配给不同的线程,实现并行处理;2) 通过同步机制确保线程间协调一致,避免资源竞争和数据不一致问题。此外,理解并发编程还涉及锁机制、线程池和异步编程等关键技术。 ... [详细]
  • 深入解析:React与Webpack配置进阶指南(第二部分)
    在本篇进阶指南的第二部分中,我们将继续探讨 React 与 Webpack 的高级配置技巧。通过实际案例,我们将展示如何使用 React 和 Webpack 构建一个简单的 Todo 应用程序,具体包括 `TodoApp.js` 文件中的代码实现,如导入 React 和自定义组件 `TodoList`。此外,我们还将深入讲解 Webpack 配置文件的优化方法,以提升开发效率和应用性能。 ... [详细]
author-avatar
大豆子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有