Pydantic 模型

Pydantic 就是 FastAPI 自带的自动校验工具,专门管「前端传给后端的数据」,自动检查格式、自动报错、自动规范返回内容,不用你手写一堆 if 判断。

举个生活例子理解 你做登录接口,前端要传账号 + 密码,需求规则:

• 用户名不能为空,长度 3~20 个字

• 密码最少 6 位,不能全是数字

• 不传这两个参数直接报错

不用 Pydantic:你要手写一堆判断,如下所示:

复制代码
# 纯原生写法,巨啰嗦
@app.post("/login")
def login(username: str=None, password: str=None):
    if not username:
        return {"code":400, "msg":"用户名不能为空"}
    if len(username) <3 or len(username)>20:
        return {"code":400, "msg":"用户名长度错误"}
    if not password or len(password)<6:
        return {"code":400, "msg":"密码至少6位"}
    if password.isdigit():
        return {"code":400, "msg":"密码不能全数字"}
    # 验证通过再查库

用 Pydantic:把规则写成类,自动校验 在 schemas/user.py 写一个登录模型,如下所示:

复制代码
from pydantic import BaseModel, Field

# 登录入参校验模型
class UserLogin(BaseModel):
    # 用户名:必填,3-20字符
    username: str = Field(min_length=3, max_length=20, description="登录账号")
    # 密码:必填,最少6位
    password: str = Field(min_length=6, description="登录密码")

接口直接拿来用,不用写任何 if 判断:

复制代码
@app.post("/login")
def login(req: UserLogin):
    # 走到这里,req里的数据一定符合规则,不符合的请求已经被自动拦截了
    print(req.username, req.password)

Pydantic 两大核心用途(对应你项目里的 schemas)

用途 1:校验前端「发过来」的数据(入参校验)

所有前端 POST、PUT 提交的 JSON,全部用 Pydantic 约束: • 字段是不是必填 • 字符串长度、数字大小 • 邮箱、手机号、URL 格式是否正确 • 枚举限制(比如订单状态只能是 待支付 / 已完成 / 取消) • 类型强制转换(前端传字符串数字,自动转 int)

错误示例:前端传 username="" 空字符串Pydantic 自动拦截,返回:用户名长度不能小于3。

用途 2:规范后端「返回给前端」的数据(输出序列化)

数据库 models 里有完整用户表:id、用户名、密码、手机号、创建时间。我们不能把密码返回给前端,这时用 Pydantic 过滤字段:

复制代码
# 返回给前端的用户模型,隐藏密码
class UserOut(BaseModel):
    id: int
    username: str
    create_time: str
    # 没有 password 字段,自动不会返回密码

    # 开启 ORM 模式,可以直接接收数据库查询出来的对象
    class Config:
        orm_mode = True

从数据库查出用户对象后,直接丢给这个模型,自动转成干净 JSON,敏感字段直接屏蔽。