FastAPI - Pydantic相关应用

news2025/1/9 17:04:59

在这里插入图片描述


参考链接:Pydantic官方文档


文章目录

    • 定义数据模型
    • 创建模型实例
    • 数据验证
    • 数据转换
    • 模型转换
    • 模型更新
    • 模型配置
    • 辅助类
      • Field


Pydantic 是一个 Python 库,主要用于数据验证和管理。数据验证是指检查数据是否符合预定的规则和格式,比如检查数据类型是否正确,是否缺少必要的字段等。数据管理是指定义数据的结构和行为,比如设置默认值,转换数据类型等。


以下是 Pydantic 的一些基本操作语法:

定义数据模型

首先,通过继承 Pydantic 提供的 BaseModel 类定义一个数据模型:

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str
    email: str
    is_active: bool = True

在这个例子中,定义了 User 数据模型,有四个字段:id(整数类型)、name(字符串类型)、email(字符串类型)和 is_active(布尔类型,默认值为 True)。

创建模型实例

创建数据模型的实例非常简单,只需要按照定义的字段传递相应的值即可:

user = User(id=1, name="John Doe", email="john.doe@example.com")

如果某个字段有默认值,你可以选择不提供它:

user = User(id=1, name="John Doe", email="john.doe@example.com")  # is_active 将默认为 True

数据验证

当创建模型实例时,Pydantic 会自动进行数据验证。如果数据不符合定义的类型,会进行报错:

try:
    user = User(id="not_an_integer", name="John Doe", email="john.doe@example.com")
except ValidationError as e:
    print(str(e))  # 输出错误信息

数据转换

Pydantic 可以自动进行数据类型转换。例如,如果传递一个字符串类型的 id,Pydantic 会自动将其转换为整数类型:

user = User(id="1", name="John Doe", email="john.doe@example.com")
print(user.id)  # 输出: 1

模型转换

Pydantic 可以将模型转换为字典或 JSON 格式:

user_dict = user.dict()
print(user_dict)  # 输出: {'id': 1, 'name': 'John Doe', 'email': 'john.doe@example.com', 'is_active': True}

user_json = user.json()
print(user_json)  # 输出: {"id": 1, "name": "John Doe", "email": "john.doe@example.com", "is_active": true}

模型更新

可以使用 update 方法来更新模型的属性:

user.update(name="Jane Doe")
print(user.name)  # 输出: Jane Doe

模型配置

Pydantic 允许通过 Config 类来配置模型的行为。例如,你可以设置一个示例数据,这在生成文档时非常有用:

class User(BaseModel):
    id: int
    name: str
    email: str
    is_active: bool = True

    class Config:
        schema_extra = {
            "example": {
                "id": 1,
                "name": "John Doe",
                "email": "john.doe@example.com",
                "is_active": True,
            }
        }

在这个例子中,添加了 Config 类来定义模型的元数据,比如 schema_extra,可以用于生成文档或提供示例数据。

辅助类

Field

导入

from pydantic import BaseModel, Field

字段别名

使用 alias 参数可以为字段设置别名,这在处理 JSON 数据时非常有用,因为 JSON 字段名通常与 >Python 字段名不同:

class User(BaseModel):
    id: int = Field(alias="_id")
    name: str
    email: str = Field(alias="email_address")
    is_active: bool = Field(default=True)

在这个例子中,id 字段在 JSON 数据中的别名是 _id,而 email 字段的别名是 email_address

字段描述

使用 description 参数可以为字段添加描述信息,这在生成文档时非常有用:

class User(BaseModel):
    id: int = Field(description="The unique identifier of the user")
    name: str = Field(description="The full name of the user")
    email: str = Field(description="The user's email address")
    is_active: bool = Field(default=True, description="Whether the user is active or not")

字段标题

使用 title 参数可以为字段设置标题,这在生成文档时非常有用:

class User(BaseModel):
    id: int = Field(title="The ID of the user")
    name: str = Field(title="The Name of the user")
    email: str = Field(title="The Email of the user")
    is_active: bool = Field(default=True, title="The Active Status of the user")

字段示例

使用 example 参数可以为字段设置示例值,这在生成文档或测试时非常有用:

class User(BaseModel):
    id: int = Field(example=123)
    name: str = Field(example="John Doe")
    email: str = Field(example="john.doe@example.com")
    is_active: bool = Field(default=True, example=True)

字段默认值

Field 的 default 参数可以设置字段的默认值:

class User(BaseModel):
    id: int
    name: str
    email: str
    is_active: bool = Field(default=True)

在这个例子中,is_active 字段有一个默认值 True。

字段常量

Field 的 const 参数可以设置字段为常量,这意味着该字段的值在实例化后不能被修改:


class User(BaseModel):
    id: int
    name: str
    email: str
    is_active: bool = Field(default=True, const=True)

在这个例子中,is_active 字段被设置为常量,它的值在实例化后不能被修改。

字段验证

Field 的 regex 参数可以设置字段的正则表达式验证:

class User(BaseModel):
    id: int
    name: str
    email: str = Field(regex=r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")
    is_active: bool = Field(default=True)

在这个例子中,email 字段的值必须匹配指定的正则表达式,否则会抛出验证错误。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++项目文件夹重命名

文章目录 一、改变项目文件夹名?1. 手动改名2. 自动改名 二、全局替换原文件名的引用1.打开Visual Studio 2022软件 一、改变项目文件夹名? 1. 手动改名 文件名一个一个改挺麻烦的 2. 自动改名 import java.io.File; import java.util.Optional;publi…

leetcode_47.全排列 II

47. 全排列 II 题目描述:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 输入:nums [1,2,3] …

Optional学习记录

Optional出现的意义 在Java中,我们经常遇到的一种异常情况:空指针异常,在原本的编程中,为了避免这种异常,我们通常会向对象进行判断,然而,过多的判断语句会让我们的代码显得臃肿不堪。 所以在J…

老Java学 Go 笔录(一) 到底为什么要学习 go ?

文章目录 一.到底什么是go ?1.1 历史渊源1.2 优秀特性1.2 应用场景1.3 和 java 有什么不同 二.聊一聊一个 java 的我为什么要学一学 go ?2.1 生活不止眼前苟且,还有诗和远方.但先要苟住2.2 了解一项新技能 三.打算怎么去学3.1 官网大概搂一遍3.2 b 站的学习视频跟着走一回3.3…

经纬度聚类:聚类算法比较

需求: 将经纬度数据,根据经纬度进行聚类 初始数据 data.csv K均值聚类 简介 K均值(K-means)聚类是一种常用的无监督学习算法,用于将数据集中的样本分成K个不同的簇(cluster)。其基本思想是…

产品AB测试设计

因为vue2项目升级到vue3经历分享1,vue2项目升级到vue3经历分享2,前端系统升级,界面操作也发生改变,为了将影响降到最低,是不能轻易让所有用户使用新系统的。原系统使用好好的,如果新界面用户不喜欢&#xf…

C语言中字符串输入的3种方式

Ⅰ gets() 函数 gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间 # include <stdio.h> int main(void) {char a[256] {0};gets(a);printf("%s",a);return 0; }Ⅱ getchar() # include <stdio.h> int mai…

【实验】根据docker部署nginx并且实现https

环境准备 systemctl stop firewalld setenforce 0 安装docker #安装依赖包 yum -y install yum-utils device-mapper-persistent-data lvm2 #设置阿里云镜像 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装最新版…

DSP实时分析平台设计方案:924-6U CPCI振动数据DSP实时分析平台

6U CPCI振动数据DSP实时分析平台 一、产品概述 基于CPCI结构完成40路AD输入&#xff0c;30路DA输出的信号处理平台&#xff0c;处理平台采用双DSPFPGA的结构&#xff0c;DSP采用TI公司新一代DSP TMS320C6678&#xff0c;FPGA采用Xilinx V5 5VLX110T-1FF1136芯片&#xff…

奇偶校验码

目录 前言 校验原理简介 奇偶校验码 前言 在前两个文章的学习中,我们已经知道了数字字符这些简单的数据应该怎么在计算机内部进行表示,其实本质上是0101的二进制代码,但是这些数据在计算机内部进行计算存取和传送的过程中,由于计算机原器件可能会发生故障,也有可能因为某些…

Qt服务器端与客户端交互

Qt做客户端与服务器端交互第一步引入network 第一步引入network后继续编程首先界面设计 创建server和socket 引入QTcpServer&#xff0c;QTcpSocket MainWindow.h代码如下 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer&…

STM32入门学习之ADC

1.ADC在STM32进行数据采集时十分重要。通过ADC可以将外界的数字信号转换为模拟信号&#xff0c;以满足采样的需求。(资料参考于正点原子) STM32 拥有 1~3 个 ADC &#xff08; STM32F101/102 系列只有 1 个 ADC &#xff09;&#xff0c;这些 ADC 可以独立使用&#…

《老相册》读后感

外面在下着瓢泼大雨&#xff0c;豆粒大的雨点打在窗户上&#xff0c;发出啪啪的巨响。这样的雨天&#xff0c;是不适宜外出的&#xff0c;最惬意的方式就是一个人待在宿舍里&#xff0c;打开一本书&#xff0c;慢慢地看&#xff0c;静静地想&#xff0c;让所有的烦恼融化在这雨…

数据结构学习/复习7--栈的实现/括号匹配练习题/队列的实现/队列实现栈练习

一、栈 1.概念及性质 2.栈的实现(top0版) 注意事项&#xff1a;top也可初始为-1,代码需要调整 二、栈练习 1.括号匹配 三、队列 1.概念及性质 2、队列的实现 四、队列练习 1.两个队列实现栈

从零开始学AI绘画,万字Stable Diffusion终极教程(四)

【第4期】图生图 欢迎来到SD的终极教程&#xff0c;这是我们的第四节课 这套课程分为六节课&#xff0c;会系统性的介绍sd的全部功能&#xff0c;让你打下坚实牢靠的基础 1.SD入门 2.关键词 3.Lora模型 4.图生图 5.controlnet 6.知识补充 在前面的课程中&#xff0c;我…

动手写一个简单的Android 表格控件支持固定列

Android 动手写一个简洁版表格控件 简介 源码已放到 Github Gitee 作为在测绘地理信息行业中穿梭的打工人&#xff0c;遇到各种数据采集需求&#xff0c;既然有数据采集需求&#xff0c;那当然少不了数据展示功能&#xff0c;最常见的如表格方式展示。 当然&#xff0c;类似…

论文辅助笔记:TimeLLM

1 __init__ 2 forward 3 FlattenHead 4 ReprogrammingLayer

Go 语言基础(一)【基本用法】

前言 最近心情格外不舒畅&#xff0c;不仅仅是对前途的迷茫&#xff0c;这种迷茫倒是我自己的问题还好&#xff0c;关键它是我们这种普通吗喽抗衡不了的。 那就换个脑子&#xff0c;学点新东西吧&#xff0c;比如 Go&#xff1f; 1、Go 语言入门 介绍就没必要多说了&#xff0…

vue快速入门(五十四)$nextTick的使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容 $nextTick的使用场景演示 源码 App.vue <template><div id"app"><h3>{{name}}</h3><button click"showfixed">修改</button><form action"post" v-s…

Git常用(持续更新)

常用场景&#xff1a; 初始化&#xff1a; git config --global user.name "codelabs" git config --global user.email mycodelabs.com git init git remote add origin https://github.com/username/repository.git git pull origin master 提交&#xff1a; gi…