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

不调整类声明顺序时Python如何引用后续定义的Pydantic类?

问题原因

你遇到的是Pydantic循环引用场景的典型报错,你使用ForwardRef或字符串标注类型的操作是正确的,只是缺少了类全部定义完成后更新前向引用的步骤,Pydantic还没将字符串/ForwardRef标记的类型解析为实际存在的类,所以类型校验时会抛出TypeError: issubclass() arg 1 must be a class错误。

解决方案(不调整类声明顺序)

你只需要在两个类都定义完成后,调用Pydantic对应的更新前向引用的方法即可,不同版本的Pydantic调用的方法有区别:

Pydantic V2 实现代码

import datetime
from typing import Optional, List
from pydantic import BaseModel

# 此处为你的RoleBase、UserBase原有定义,不做修改
class RoleBase(BaseModel):
    name: str
class UserBase(BaseModel):
    username: str

class Role(RoleBase):
    id: int
    # 直接用字符串标注还未定义的User类即可
    users: List['User'] = []

    class Config:
        orm_mode = True # V2兼容该参数,也可替换为from_attributes = True

class User(UserBase):
    id: int
    date_created: datetime.datetime
    profile_image: Optional[str] = None

    class Config:
        orm_mode = True

# 关键步骤:两个类全部定义完成后,调用rebuild方法解析前向引用
Role.model_rebuild()

Pydantic V1 实现代码

类定义逻辑和V2完全一致,仅最后一步调用的更新方法不同:

# 前面类定义和上述代码完全一致
# 替换最后一步的rebuild为update_forward_refs
Role.update_forward_refs()

如果两个类互相引用(比如User类中也定义了role: 'Role'字段),则需要同时调用两个类的更新方法:

Role.update_forward_refs()
User.update_forward_refs()

内容的提问来源于stack exchange,提问作者Gipss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:15:07