不调整类声明顺序时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
相关产品推荐
相关产品推荐

