Pydantic中能否将一个Schema的字段作为另一Schema的字段类型
结论
直接写status_name: StatusOut.name的写法不可行,触发AttributeError: type object 'StatusOut' has no attribute 'name'是预期内的报错。
原因很简单:Pydantic模型类里写的id: int、name: str是类型注解,不是类的实际可访问属性,定义阶段直接点取属性必然找不到。
对应正确实现方案
根据你的实际需求选对应的写法即可:
- 需求1:
status_name只需要存储StatusOut中name字段的字符串值,不需要嵌套完整Status对象
直接给status_name标注对应类型即可。如果需要从嵌套的Status对象自动提取name值作为返回字段,用计算字段实现,示例代码如下:
如果入参直接传status_name的字符串值,不需要从嵌套对象提取,直接写# 先从定义StatusOut的文件导入模型 from your_status_module import StatusOut from pydantic import BaseModel, computed_field class UserOut(BaseModel): name: str status: StatusOut # 入参接收完整的Status嵌套对象 # 自动计算生成status_name字段,序列化返回时会自动带上 @computed_field @property def status_name(self) -> str: return self.status.namestatus_name: str即可,不需要额外引用StatusOut的字段。 - 需求2:想复用StatusOut中name字段的类型定义,避免重复写复杂类型注解
可以通过类型提取工具拿到字段类型后再做标注,示例代码如下:from typing import get_type_hints from your_status_module import StatusOut from pydantic import BaseModel # 提前提取StatusOut中name字段的类型 StatusNameType = get_type_hints(StatusOut)["name"] class UserOut(BaseModel): name: str status_name: StatusNameType # 等价于写status_name: str,后续如果StatusOut的name类型改了这里会自动同步
注意:Pydantic的字段元信息统一存储在模型类的
model_fields(V2版本)或__fields__(V1版本)属性中,不会直接作为类的普通属性暴露,不要试图通过直接点取类属性的方式访问字段。
内容的提问来源于stack exchange,提问作者alispa
相关产品推荐
相关产品推荐

