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

Pydantic v1动态创建模型时__fields__属性未填充问题求助

解决Pydantic v1动态创建模型时__fields__为空的问题

问题原因

你使用create_model时直接将Enum类型作为字段值传入,不符合Pydantic v1的动态模型定义规则。静态类中specialty: SpecialtyEnumStatic的写法是隐式声明了必填字段,但动态创建时需要显式用**(类型, 必填标记)**或Field对象的形式定义字段,才能让Pydantic正确生成__fields__元数据。

修复后的代码

from enum import Enum
from langchain.pydantic_v1 import BaseModel, create_model


class SpecialtyEnumStatic(str, Enum):
    psychiatry = "SPECIALTY:Psychiatry"
    sports_medicine_internal_medicine = "SPECIALTY:Sports Medicine (Internal Medicine)"


class ProviderSearchInputStatic(BaseModel):
    specialty: SpecialtyEnumStatic


print(ProviderSearchInputStatic.__fields__)
# {'specialty': ModelField(name='specialty', type=SpecialtyEnumStatic, required=True)}

specialties = {
    'psychiatry': 'SPECIALTY:Psychiatry',
    'sports_medicine_internal_medicine': 'SPECIALTY:Sports Medicine (Internal Medicine)'
}

SpecialtyEnumDynamic = Enum('SpecialtyEnumDynamic', specialties)

# 关键修改:将字段定义改为 (类型, ...) 显式标记必填
ProviderSearchInputDynamic = create_model(
    'ProviderSearchInputDynamic',
    specialty=(SpecialtyEnumDynamic, ...),
    __base__=BaseModel
)

print(ProviderSearchInputDynamic.__fields__)
# {'specialty': ModelField(name='specialty', type=SpecialtyEnumDynamic, required=True)}

补充说明

  • 若需要定义可选字段,可将...替换为默认值,例如specialty=(SpecialtyEnumDynamic, None)
  • 也可以用Field类实现更精细化的字段控制,比如添加描述:
    from langchain.pydantic_v1 import Field
    ProviderSearchInputDynamic = create_model(
        'ProviderSearchInputDynamic',
        specialty=(SpecialtyEnumDynamic, Field(description="医生专业领域")),
        __base__=BaseModel
    )
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:02:04