python进阶-Pydantic模型

1. 什么是 Pydantic

Pydantic 是一个 Python 库,用来:

  • 定义数据结构
  • 自动校验数据
  • 自动类型转换
  • 生成结构化数据(字典、JSON)
  • 配合 FastAPI 实现接口参数校验

一句话:Pydantic 模型 = 带校验规则的数据类。

2. 核心作用

  1. 数据校验:类型不对、格式不对直接报错
  2. 类型自动转换:字符串数字 → int/float
  3. 结构化数据:接口入参、出参统一格式
  4. 自动生成文档 :FastAPI 自动用它生成 /docs
  5. ORM 模型转换:数据库对象 ↔ 接口数据

3. 基础使用

3.1 安装

复制代码
pip install pydantic

3.2 定义最简单的模型

复制代码
from pydantic import BaseModel

class User(BaseModel):
    name: str
    age: int
    email: str

这就是一个 Pydantic 模型

4. 自动校验 & 自动类型转换

复制代码
user = User(name="张三", age="20", email="xxx@qq.com")
print(user.age)  # 输出 int 20(自动转)

传错类型会直接报错:

复制代码
user = User(name="张三", age="abc", email="xxx")
# 直接抛出 ValidationError

5. 常用字段校验

复制代码
from pydantic import BaseModel, Field, EmailStr

class User(BaseModel):
    name: str = Field(..., min_length=2, max_length=20)
    age: int = Field(..., ge=18, le=100)
    email: EmailStr  # 自动校验邮箱格式

常用规则:

  • min_length / max_length:长度
  • ge:大于等于
  • gt:大于
  • le:小于等于
  • lt:小于
  • ...:表示必填

6. 模型继承

复制代码
class UserBase(BaseModel):
    name: str
    age: int

class UserCreate(UserBase):
    password: str

class UserOut(UserBase):
    id: int

实际开发中非常常用:

  • Base:公共字段
  • Create:创建时需要的字段
  • Out:返回给前端的字段

7. 模型转字典 / JSON

复制代码
user = User(name="张三", age=20, email="xxx@qq.com")

# 转字典
user.dict()

# 转 JSON 字符串
user.json()

8. 嵌套模型

复制代码
class Address(BaseModel):
    city: str
    street: str

class User(BaseModel):
    name: str
    address: Address  # 嵌套模型

9. 列表、泛型

复制代码
from typing import List

class UserOut(BaseModel):
    id: int
    name: str

class UserList(BaseModel):
    total: int
    items: List[UserOut]

10. ORM 模式

FastAPI + SQLAlchemy 必用:

复制代码
class UserOut(BaseModel):
    id: int
    name: str

    class Config:
        orm_mode = True

这样就能直接:

复制代码
user_out = UserOut.from_orm(db_user)

11. 可选字段 & 默认值

复制代码
class User(BaseModel):
    name: str
    age: int | None = None  # 可选
    is_vip: bool = False    # 默认值

12. Pydantic 在 FastAPI 中的作用

  1. 请求体校验

    @app.post("/user")
    def create_user(user: User):
    return user

  2. 查询参数校验

  3. 路径参数校验

  4. 自动生成接口文档 /docs

  5. 统一返回格式

相关推荐
敲代码的嘎仔10 分钟前
实习日志day6--实习日志day6--title命名规范化&businessType纠正&补充缺失的@Log注解&报警与通信模块补充&产出阶段总结文档
java·开发语言·人工智能·git·python·实习·大二
江华森28 分钟前
Python 实现高德地图找房(一):环境搭建与数据爬虫
开发语言·爬虫·python
杜子不疼.29 分钟前
【Qt初识】信号槽(三):机制意义、断开连接与 Lambda 表达式
开发语言·数据库·qt
VIP_CQCRE1 小时前
用 Ace Data Cloud 快速接入 OpenAI Chat Completions:对话、流式、多轮和多模态一篇打通
python·ai·openai·api·教程
老迟到的茉莉2 小时前
Hermes 是谁?跟 Claude Code 差在哪
开发语言·python
学逆向的2 小时前
汇编——内存
开发语言·汇编·算法·网络安全
Day(AKA Elin)2 小时前
【Day】MTP(Multi Token Prediction)技术学习
python·深度学习·学习·llama
lbb 小魔仙2 小时前
MuMu 模拟器 6.0 硬核测评:这次升级确实不一样
java·开发语言·模拟器·mumu·硬核测评
r_oo_ki_e_2 小时前
Java 线程池
java·开发语言
杜子不疼.3 小时前
【Qt初识】信号槽(二):自定义信号函数与槽函数
开发语言·qt