您的当前位置:首页 >系统运维 >FastAPI 响应模型:Pydantic 的数据验证与转换,一篇吃透! 正文
时间:2025-11-04 12:28:13 来源:网络整理编辑:系统运维
是否遇到过这些问题?数据库返回字段太多,前端只要几个?接口文档不一致,测试老是报错?ORM 对象直接返回,总是类型错误?快用 FastAPI 的响应模型response_model)+ Pydanti
是响型否遇到过这些问题?
数据库返回字段太多,前端只要几个?应模验证接口文档不一致,测试老是数据报错?ORM 对象直接返回,总是转换类型错误?快用 FastAPI 的响应模型(response_model)+ Pydantic,自动校验、篇吃转换、响型过滤、应模验证文档全搞定!数据

响应模型用于定义接口的免费源码下载返回结构。FastAPI 会根据响应模型:
自动校验字段类型自动过滤多余字段自动转换格式自动生成文档(OpenAPI)2. 快速上手:定义响应结构 复制from pydantic import BaseModel class UserOut(BaseModel): id: int name: str email: str1.2.3.4.5.6.在接口中使用:
复制from fastapi import FastAPI app = FastAPI() @app.get("/users/{user_id}",篇吃 response_model=UserOut) def get_user(user_id: int): return { "id": user_id, "name": "Alice", "email": "alice@example.com", "is_admin": True # 会自动被过滤掉 }1.2.3.4.5.6.7.8.9.10.11.12.最终返回只包含指定字段:
复制{ "id": 1, "name": "Alice", "email": "alice@example.com" }1.2.3.4.5. 3. 支持嵌套模型和列表模型 复制class Address(BaseModel): city: str country: str class UserOut(BaseModel): id: int name: str address: Address1.2.3.4.5.6.7.8.列表结构也支持:
复制@app.get("/users/", response_model=list[UserOut]) def get_users(): return [...]1.2.3. 4. ORM 模式(必须开启):与数据库模型打通如果你使用 SQLAlchemy、Tortoise ORM 等,响型接口函数中返回的应模验证是 ORM 实例而不是字典,就必须开启 “ORM 模式”。数据
为什么要开启?转换
因为 ORM 对象不是标准字典,Pydantic 默认不能识别对象的篇吃属性,需要开启专用模式:
(1) Pydantic v1 的高防服务器写法
复制class UserOut(BaseModel): id: int name: str class Config: orm_mode = True1.2.3.4.5.6.FastAPI 会自动调用 obj.__dict__ 或属性方法,提取字段。
(2) Pydantic v2 的写法(推荐)
复制class UserOut(BaseModel): id: int name: str model_config = { "from_attributes": True # 替代 orm_mode }1.2.3.4.5.6.7.from_attributes=True 更加清晰地表明“这个模型的字段可以从属性中提取”。
(3) 搭配 SQLAlchemy 使用示例
复制from sqlalchemy.orm import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) name = Column(String) # 响应模型 class UserOut(BaseModel): id: int name: str model_config = { "from_attributes": True } @app.get("/users/{id}", response_model=UserOut) def get_user(id: int, db: Session = Depends(get_db)): return db.query(User).get(id)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.(4) 搭配 Tortoise ORM 使用示例
复制from tortoise.models import Model from tortoise import fields class User(Model): id = fields.IntField(pk=True) name = fields.CharField(max_length=50) class UserOut(BaseModel): id: int name: str model_config = { "from_attributes": True } @app.get("/users/{id}", response_model=UserOut) async def get_user(id: int): user = await User.get(id=id) return user1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19. 5. 响应字段别名与描述(自动生成文档) 复制from pydantic import Field class UserOut(BaseModel): id: int name: str = Field(..., alias="username", description="用户名")1.2.3.4.5.返回结构变为:
复制{ "id": 1, "username": "Alice" }1.2.3.4.在 Swagger 文档中也能自动显示字段描述!
6. Pydantic v1 vs v2 对比功能点
v1
v2(推荐)
底层实现
Python 实现
Rust 实现(pydantic-core)
性能
一般
🚀 提升 5~50 倍
默认值声明
可用 =
推荐使用 Field() 显式写法
ORM 支持
Config.orm_mode = True
model_config = {"from_attributes": True}
JSON 解析
Python 实现
快速原生 JSON 序列化
联合类型支持
较弱
强化了对 Union, Annotated 的支持
7. 总结response_model 是 FastAPI 最强大功能之一,搭配 Pydantic 使用,自动:
校验字段过滤无用字段自动格式转换自动生成 Swagger 文档无缝对接 ORM 模型对象ORM 模式配置(orm_mode 或 from_attributes)一定不能忘,否则可能会返回空数据、字段丢失等问题。云服务器提供商
Win10无法进入安全模式的解决办法(修复Win10无法进入安全模式的常见问题及解决方法)2025-11-04 11:19
MySQL修改root密码并不难2025-11-04 11:05
edge浏览器下载速度慢怎么提升_edge浏览器下载速度提升方法2025-11-04 10:38
实现MySQL支持中文该如何操作?2025-11-04 10:32
如何使用MXKey链接电脑(简单教程助您轻松连接MXKey与电脑)2025-11-04 10:30
nvm:NodeJs版本管理工具下载安装与使用教程2025-11-04 10:04
MySQL修改表的实际应用代码示例2025-11-04 09:58
Mysql临时表运行是需要的代码有那些?2025-11-04 09:57
如何使用光驱安装系统(光驱安装系统的步骤和技巧)2025-11-04 09:52
用MySQL GRANT语句来增添新用户实操2025-11-04 09:48
电脑剪映教程(从零开始,学会使用剪映软件编辑专业级视频)2025-11-04 12:02
三种常见的MySQL数据库设计最佳实践2025-11-04 11:54
PHP PDO UPDATE 语句:解决多字段更新不生效的问题2025-11-04 11:50
DNS解析问题2025-11-04 11:18
解决电脑Java平台错误的有效方法(探索如何应对和修复常见的电脑Java平台错误)2025-11-04 11:17
MySQL 中文乱码的产生与解决2025-11-04 10:38
MySQL导入sql 文件的5大步骤2025-11-04 10:26
MySQL alter 语句的实际操作2025-11-04 10:14
三星9100使用移动卡上网的网速如何?(以三星9100为例,探讨移动卡上网的速度表现及使用体验。)2025-11-04 10:04
MySQL条件select case的实现2025-11-04 09:44