schemas/init.py 标准写法(两种方案,按需选择)
目录回顾
项目根目录/
├── main.py
├── schemas/
├── __init__.py
├── user.py
└── product.py
└── routers/
├── users.py
└── products.py
方案1:推荐!统一导出(外部导入更简洁)
schemas/init.py
python
# 从同目录文件导入模型,并对外暴露
from .user import UserCreate, UserUpdate, UserResponse
from .product import ProductCreate, ProductUpdate, ProductResponse
# 可选:显式声明允许导出的变量,编辑器提示更友好
__all__ = [
"UserCreate",
"UserUpdate",
"UserResponse",
"ProductCreate",
"ProductUpdate",
"ProductResponse",
]
好处
之后在 routers/users.py 可以这样导入:
python
# 绝对导入(推荐工程使用)
from schemas import UserCreate, UserResponse
# 相对导入写法
from ..schemas import UserCreate, UserResponse
不用写长长的 from schemas.user import xxx,代码清爽。
方案2:极简写法(不做聚合,不用修改 init.py)
__init__.py 可以空白文件 ,什么都不写。
导入时必须写完整路径:
python
from schemas.user import UserCreate, UserResponse
from schemas.product import ProductUpdate
适合超大型项目,模块极多,不希望全部聚合在顶层。
实操示例对比
开启聚合(方案1)✅
python
# routers/users.py
from schemas import UserCreate, UserResponse
不聚合(方案2,空init)
python
# routers/users.py
from schemas.user import UserCreate, UserResponse
重要小知识点
__init__.py作用:让 schemas 文件夹被识别为Python包;没有它旧版本Python无法导入。__all__控制from xxx import *能拿到哪些对象,规范项目建议加上。- 新增模型时,记得同步更新
__init__.py和__all__。
扩展示范(如果你后续新增order.py)
schemas/order.py
python
from pydantic import BaseModel
class OrderCreate(BaseModel):
pid: int
num: int
更新 schemas/init.py
python
from .user import UserCreate, UserUpdate, UserResponse
from .product import ProductCreate, ProductUpdate, ProductResponse
from .order import OrderCreate
__all__ = [
"UserCreate",
"UserUpdate",
"UserResponse",
"ProductCreate",
"ProductUpdate",
"ProductResponse",
"OrderCreate",
]