FastAPI教程-BaseModel请求体模型、响应模型

介绍

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

age: int | None = None   # 两种含义:可以不传;传值可以给null

❌错误写法: age:int = None,pydantic v2会报错,类型不匹配。

3.容器类型 列表、字典

tags: list[str]
extra: dict[str, int]

4.嵌套模型(非常常用,对应嵌套JSON)

class Address(BaseModel):
    city: str
    street: str

class User(BaseModel):
    name: str
    address: Address  #嵌套对象

接收JSON:

{
  "name":"张三",
  "address":{"city":"长春","street":"xx路"}
}

5.集合

ids: set[int]

常用方法

创建对象

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数据

@app.post("/student")
def create(u: StudentCreate):
    pass
  • FastAPI把http的json请求体解析为UserCreate实例
  • 校验失败返回422

2)作为response_model

作用:返回结果给前端,具体:

  1. 过滤敏感字段(比如密码不返回)
  2. 格式化输出,自动生成返回值openapi文档
  3. 自动转换ORM对象为字典
@app.get("/users/{id}", response_model=UserBase)
def get_user(id:int):
    return db_user #可以直接返回ORM对象,由response_model做序列化过滤

提示:
请求模型与响应模型建议分开:创建的时候要传password;返回接口不要返回password。

# 请求模型:提交需要password
class UserCreate(BaseModel):
    username:str
    password:str

#响应模型:返回不要password
class UserResp(BaseModel):
    username:str

原文出处:/show_1GW3rNYbMqWp.html