validator\model_validator\root_validator

@validator@model_validator@root_validator 这三个装饰器的区别及其适用场景。

1. @validator

  • 作用@validator 装饰器用于定义针对一个或多个具体字段的验证逻辑。它允许在字段值被设置到模型实例之前或之后执行自定义的验证逻辑。
  • 参数
    • field_names:指定要验证的字段名称。
    • pre:布尔值,指定验证器是在类型验证之前 (pre=True) 还是在之后 (pre=False) 运行。
    • always:布尔值,指定即使该字段没有被提供也运行验证器。
  • 适用场景:当需要对某个字段进行特定的检查或转换时,可以使用 @validator。例如,确保一个字段的值大于零,或者将字符串转换为大写等。

2. @model_validator

  • 作用@model_validator 装饰器用于定义针对整个模型的验证逻辑。它允许在所有字段的类型验证之后,基于这些字段之间的关系执行更复杂的验证逻辑
  • 参数
    • mode:指定验证器的模式,可以是 'before''after' 或 'wrap'
      • 'before':在任何字段验证之前运行。
      • 'after':在所有字段验证之后运行。
      • 'wrap':包裹现有的验证器。
  • 适用场景:当需要根据模型中的多个字段值来决定整体的有效性时,可以使用 @model_validator。例如,检查两个日期字段之间的时间范围是否合理,或者确保某些字段的组合满足特定条件。

3. @root_validator

  • 作用@root_validator 装饰器也是用于定义针对整个模型的验证逻辑。它允许在所有字段的类型验证之前或之后,基于这些字段之间的关系执行更复杂的验证逻辑。不过,@root_validator 已经被弃用,建议使用 @model_validator
  • 参数
    • pre:布尔值,指定验证器是在所有字段的类型验证之前 (pre=True) 还是在之后 (pre=False) 运行。
    • skip_on_failure:布尔值,指定如果之前的验证器失败是否跳过当前验证器。
  • 适用场景:虽然 @root_validator 仍然可用,但建议使用 @model_validator,因为 @model_validator 提供了更多的灵活性和更好的支持

示例代码

import os
import uvicorn
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel, validator, model_validator
from typing import Optional

app = FastAPI()


class UserRegistration(BaseModel):
    username: str
    password: str
    password_confirm: str
    age: int
    double_age: Optional[int] = None

    # 验证年龄
    @validator('age')
    def validate_age(cls, v):
        if v < 18:
            raise ValueError('年龄必须大于18岁')
        return v

    # 验证密码是否匹配
    @model_validator(mode='after')
    def passwords_match(cls, values):
        password = values.password
        password_confirm = values.password_confirm
        if password != password_confirm:
            raise ValueError('密码与确认密码不匹配')
        return values

    # 设置 double_age
    @model_validator(mode='after')
    def set_double_age(cls, values):
        age = values.age
        if age and age >= 18:
            values.double_age = age * 2
        return values


@app.post("/api/users/register", response_model=UserRegistration)
async def register_user(user: UserRegistration):
    # 这里可以添加更多的业务逻辑,例如将用户信息保存到数据库
    return user


# 主程序入口
if __name__ == "__main__":
    # 获取应用模型名称,用于uvicorn运行
    app_model_name = os.path.basename(__file__).replace(".py", "")
    print(app_model_name)
    # 使用uvicorn运行FastAPI应用
    uvicorn.run(f"{app_model_name}:app", host='0.0.0.0', port=1235, reload=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905163.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

江协科技STM32学习- P28 USART串口数据包

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

信刻国产化智能光盘柜管理系统

在数字化时代&#xff0c;数据的长期安全储存和管理成为各行业档案部门的重要任务&#xff0c;随着光盘存储技术的不断发展和应用领域的日益广泛&#xff0c;如何高效、安全地管理海量光盘数据成为了一个亟待解决的问题。信刻智能光盘管理柜应运而生&#xff0c;以其创新的设计…

uniapp position: fixed 兼容性不显示问题

position: fixed; bottom: 0;以上运行到微信小程序时正常&#xff0c;但是h5会出现不显示的问题。 解决方法 修改为&#xff1a; position: fixed; bottom: var(--window-bottom, 0);

【python】OpenCV—Tracking(10.3)—GOTURN

文章目录 1、功能描述2、模型介绍3、代码实现4、完整代码5、结果展示6、优缺点分析7、参考 1、功能描述 基于 Generic Object Tracking using Regression Networks 方法&#xff0c;实现单目标跟踪 2、模型介绍 &#xff08;1&#xff09;发表来自 Held D, Thrun S, Savarese…

如何将本地项目上传至Gitee仓库(详细教程)

前提条件 1、本地电脑安装Git客户端 2、本地已有项目 3、Gitee注册好了账户 如果没有安装Gitee 可以区菜鸟查看一下安装教程 Git教程https://www.runoob.com/git/git-tutorial.html 操作示例 前提条件已经准备好的情况下登录gitee 码云 https://gitee.com 点解右侧加号 新…

二叉树中的深搜 算法专题

二叉树中的深搜 一. 计算布尔二叉树的值 计算布尔二叉树的值 class Solution {public boolean evaluateTree(TreeNode root) {if(root.left null) return root.val 0? false: true;boolean left evaluateTree(root.left);boolean right evaluateTree(root.right);return…

静态水印+动态水印,开启超强PPT版权保护!

在保护 PPT 内容版权时&#xff0c;水印是一种既简单又有效的手段。无论你是为了防止内容被非法复制&#xff0c;还是为了在传播中标明作者身份&#xff0c;水印都能为你的 PPT 提供额外的安全保障。 在传统的 PPT 制作中&#xff0c;最常见的水印添加方法是通过「幻灯片母版」…

std.move 可以重复使用吗?普通变量不行,shared_ptr包装后可以

std.move std::move函数本身可以重复调用&#xff0c;但这取决于对象的状态。在C中&#xff0c;std::move函数用于将一个对象转换为右值引用&#xff0c;从而允许我们从该对象中提取所有权&#xff0c;而不需要创建新的对象。然而&#xff0c;std::move并不会改变对象的状态&am…

关于图像分解的RPCA

将矩阵分解为低秩矩阵和独立同分布的高斯矩阵是PCA 当矩阵 E0 为稀疏的噪声矩阵时&#xff0c;分解为一个低秩矩阵部分 A 和一个稀疏矩阵部分 E 的 矩阵的秩和 ℓ0 范数问题都可以进行凸松弛&#xff0c;矩阵的核范数是矩阵秩的凸包络&#xff0c;&#xff08;1&#xff09;变…

XHCI 1.2b 规范摘要(八)

系列文章目录 XHCI 1.2b 规范摘要&#xff08;一&#xff09; XHCI 1.2b 规范摘要&#xff08;二&#xff09; XHCI 1.2b 规范摘要&#xff08;三&#xff09; XHCI 1.2b 规范摘要&#xff08;四&#xff09; XHCI 1.2b 规范摘要&#xff08;五&#xff09; XHCI 1.2b 规范摘要…

【远程项目管理】Focalboard如何在Windows环境使用Docker快速部署

文章目录 前言1. 使用Docker本地部署Focalboard1.1 在Windows中安装 Docker1.2 使用Docker部署Focalboard 2. 安装Cpolar内网穿透工具3. 实现公网访问Focalboard4. 固定Focalboard公网地址 前言 本篇文章将介绍如何在Windows系统本地快速部署Focalboard项目管理工具&#xff0…

WebStorm EsLint报红色波浪线

如图左侧。 这个错误是由于 ESLint 和 Prettier 的配置不一致导致的。它建议你移除多余的空格。以下是一些解决方法&#xff1a; 安装 Prettier 插件&#xff1a; 确保你在 WebStorm 中安装了 Prettier 插件&#xff0c;并确保它配置正确。 调整 ESLint 配置&#xff1a; 检查…

【Flask】二、Flask 路由机制

目录 什么是路由&#xff1f; Flask中的路由 基本路由 动态路由 路由中的HTTP方法 路由函数返回 在Web开发中&#xff0c;路由是将URL映射到相应的处理函数的过程。Flask是一个轻量级的Web应用框架&#xff0c;提供了简单而强大的路由机制&#xff0c;使得开发者能够轻松…

如何用Python同时抓取多个网页:深入ThreadPoolExecutor

背景介绍 在信息化时代&#xff0c;数据的实时性和获取速度是其核心价值所在。对于体育赛事爱好者、数据分析师和投注行业而言&#xff0c;能否快速、稳定地抓取到实时比赛信息显得尤为重要。特别是在五大足球联赛中&#xff0c;能够在比赛进行时获得比分、控球率等实时数据&a…

深入计算机语言之C++:内存管理

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;从C语言到C语言的渐深学习 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 一、 C/C的内存分布 我们先来看一段代码&#xf…

使用Vue.js和Vuex构建可维护的前端应用

使用Vue.js和Vuex构建可维护的前端应用 Vue.js简介 安装Vue.js 使用npm安装 使用CDN引入 创建Vue项目 安装Vuex 初始化Vuex Store 在Vue组件中使用Store Vuex模块化 Vuex命名空间 Vuex插件 Vuex热重载 Vuex持久化状态 Vuex调试工具 Vuex的高级用法 异步Actions 中间件 Vuex的…

云智慧完成华为原生鸿蒙系统的适配, 透视宝 APM 为用户体验保驾护航

2024 年 10 月 22 日&#xff0c;首个国产移动操作系统 —— 华为原生鸿蒙操作系统 HarmonyOS NEXT 正式面世&#xff0c;成为继 iOS 和 Android 后的全球第三大移动操作系统。HarmonyOS NEXT&#xff0c;从系统内核、数据库根基&#xff0c;到编程语言创新、AI&#xff08;人工…

Metasploit(MSF)使用

目录 Metasploit简要介绍 主要功能 漏洞利用&#xff1a; Payload 生成&#xff1a; 辅助模块&#xff1a; 后渗透模块&#xff1a; 报告生成&#xff1a; 使用教程以及案例 基础命令使用 生成被控端 命令介绍 kali启动主控端 1.启动以及设置载荷等配置 漏洞检测…

Linux 开机自动挂载硬盘

在日常使用 Linux 系统的过程中&#xff0c;我们可能需要挂载一些机械硬盘或者移动硬盘来存储数据。手动挂载虽然简单&#xff0c;但每次重启后都需要重新操作&#xff0c;未免有些繁琐。那么&#xff0c;如何让硬盘在开机时自动挂载呢&#xff1f;本篇博客将详细介绍如何通过配…

GPU 学习笔记三:GPU多机多卡组网和拓扑结构分析(基于数据中心分析)

文章目录 一、概述二、数据中心&#xff08;DC&#xff09;2.1 数据中心简介2.2 传统数据中心的网络模型2.3 脊叶网络模型&#xff08;Spine-Leaf&#xff09;2.4 Facebook的Fabric网络架构 三、基于数据中心的多机多卡拓扑3.1 Spine-Leaf 架构网络规模测算方法3.2 NVIDIA多机多…