FastAPI教程-BaseModel请求体模型、响应模型 作者:马育民 • 2026-08-14 11:56 • 阅读:10001 # 介绍 FastAPI 的请求体模型、响应模型全部基于 `pydantic.BaseModel`,Pydantic v2 为当前主流版本。 ### 作用 - 接收前端数据,封装到请求体模型中(**数据解析、类型校验、默认值、字段约束**) - 将返回前端的数据,转换为字典 - 生成OpenAPI文档 FastAPI接收到JSON,自动把json字典解析为BaseModel实例;校验失败直接返回422错误。 # 基础定义 定义 `StudentCreate` 类,要继承 `BaseModel` 父类,用于添加学生用: ``` from pydantic import BaseModel # 定义请求体模型 class StudentCreate(BaseModel): name: str age: int | None = None # 可选,默认None sex: str ``` - `name:str`:姓名,**无默认值 = 必填字段**,JSON不传该字段直接422校验错误 - `age: int | None = None`:年龄,可选字段,可以不传,或者传null - `sex`:性别,**无默认值 = 必填字段**,JSON不传该字段直接422校验错误 # 字段类型 ### 1.基础类型 `str int float bool` ### 2.可选/可为null ```python age: int | None = None # 两种含义:可以不传;传值可以给null ``` **❌错误写法:** `age:int = None`,pydantic v2会报错,类型不匹配。 ### 3.容器类型 列表、字典 ```python tags: list[str] extra: dict[str, int] ``` ### 4.嵌套模型(非常常用,对应嵌套JSON) ```python class Address(BaseModel): city: str street: str class User(BaseModel): name: str address: Address #嵌套对象 ``` 接收JSON: ```json { "name":"张三", "address":{"city":"长春","street":"xx路"} } ``` ### 5.集合 ```python ids: set[int] ``` # 常用方法 ### 创建对象 ```python obj = StudentCreate(username="李雷", sex="男") ``` ### 从字典构建模型对象 ``` u = StudentCreate.model_validate({ "username":"韩梅梅", "age":18, "sex":"女" }) ``` ### 转为python字典 **提示:**v1的`.dict()` 已经废弃 ``` d = obj.model_dump() ``` ### 转为json字符串 **提示:**v1的 `.json()` 已经废弃 ``` json_str = obj.model_dump_json() ``` # FastAPI中两种角色 - 请求体模型:接收前端发来的JSON数据,解析为请求体模型对象 - 响应模型:返回结果给前端 ### 1)作为请求体 **作用:**接收前端发来的JSON数据 ```python @app.post("/student") def create(u: StudentCreate): pass ``` - FastAPI把http的json请求体解析为UserCreate实例 - 校验失败返回422 ###2)作为response_model **作用:**返回结果给前端,具体: 1. 过滤敏感字段(比如密码不返回) 2. 格式化输出,自动生成返回值openapi文档 3. 自动转换ORM对象为字典 ```python @app.get("/users/{id}", response_model=UserBase) def get_user(id:int): return db_user #可以直接返回ORM对象,由response_model做序列化过滤 ``` **提示:** 请求模型与响应模型建议分开:创建的时候要传password;返回接口不要返回password。 ```python # 请求模型:提交需要password class UserCreate(BaseModel): username:str password:str #响应模型:返回不要password class UserResp(BaseModel): username:str ``` 原文出处:/show_1GW3rNYbMqWp.html