拆分Pydantic Schema至不同文件时遇循环导入错误求助
解决FastAPI Pydantic循环导入问题
针对你遇到的循环导入错误,核心原因是users/schemas.py和accounts/schemas.py互相导入对方的模型类,导致Python解释器加载模块时出现依赖死锁。结合你的静态类型使用习惯,用TYPE_CHECKING常量+字符串类型注解就能解决,具体修改如下:
修改users\schemas.py
from datetime import datetime from pydantic import BaseModel from typing import TYPE_CHECKING, List # 仅在类型检查时导入Account,运行时不会执行这个导入 if TYPE_CHECKING: from src.usersDomain.accounts.schemas import Account class UserBase(BaseModel): primary_email: str creation_date: datetime class UserCreate(UserBase): pass class User(UserBase): id: int # 用字符串形式标注类型,Pydantic 2会自动解析对应的Account类 accounts: List["Account"] = [] class Config: from_attributes = True
修改accounts\schemas.py
from datetime import datetime from pydantic import BaseModel from typing import TYPE_CHECKING # 仅在类型检查时导入User,运行时不会执行这个导入 if TYPE_CHECKING: from src.usersDomain.users.schemas import User class AccountBase(BaseModel): cognito_sub: str name: str family_name: str email: str phone_number: str picture: str identities: str token: str creation_date: datetime # 用字符串形式标注类型,Pydantic 2会自动解析对应的User类 user: "User" class AccountCreate(AccountBase): pass class Account(AccountBase): class Config: from_attributes = True
为什么这样能解决问题
TYPE_CHECKING是Python typing模块提供的常量,仅在类型检查工具(如mypy、PyCharm类型提示)运行时为True,实际代码运行时为False,所以运行时不会执行if TYPE_CHECKING块里的导入语句,彻底避免了循环导入。- Pydantic 2支持字符串形式的类型注解(如
"User"),运行时会自动查找并解析对应的模型类,既保留了静态类型检查的能力,又不会触发循环导入。
内容的提问来源于stack exchange,提问作者marcob8986
相关产品推荐
相关产品推荐

