You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

拆分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:07:25