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

如何动态构建Pydantic模型实例?循环字段映射问题求助

动态构建Pydantic实例与eval作用域问题解决

一、动态构建Pydantic模型实例

你原来的写法不可行,因为fields字典里存的是字符串(比如"t_one.id"),直接传给Pydantic模型的话,这些字符串不会被解析成对应对象的属性值。可以用以下两种更安全、更动态的方式实现:

方法1:通过属性名映射+getattr获取值

如果能明确哪些字段来自t_one、哪些来自t_two,可以直接用getattr动态获取属性值,还能直接复用Ttwo.__table__.columns.keys()这类字段列表:

# 定义字段来源映射
fields_from_t_one = ["id", "name"]
fields_from_t_two = Ttwo.__table__.columns.keys()  # 直接复用表字段列表

for t_one in table1:
    for t_two in table2:
        model_data = {}
        # 从t_one提取字段
        for field in fields_from_t_one:
            model_data[field] = getattr(t_one, field)
        # 从t_two提取字段
        for field in fields_from_t_two:
            model_data[field] = getattr(t_two, field)
        # 动态构建Pydantic实例
        my_list.append(PydanticModel(**model_data))

方法2:用函数映射字段取值逻辑

如果字段和对象的映射关系更复杂,可以用lambda函数封装取值逻辑:

fields_map = {
    "id": lambda t1, t2: t1.id,
    "name": lambda t1, t2: t1.name,
    "version": lambda t1, t2: t2.version,
    "area": lambda t1, t2: t2.area,
    "pack": lambda t1, t2: t2.pack,
}

for t_one in table1:
    for t_two in table2:
        model_data = {k: func(t_one, t_two) for k, func in fields_map.items()}
        my_list.append(PydanticModel(**model_data))

二、类方法中eval访问self的报错解决

你遇到的NameError是因为列表推导式会创建局部作用域,eval默认无法访问外部的self变量。强烈不推荐用eval,直接用getattr就能安全解决:

def gett(self):
    self.pack = 99
    return [getattr(self, x) for x in self.all_fields()]

如果一定要使用eval(不建议),需要手动把self传入eval的局部作用域:

def gett(self):
    self.pack = 99
    return [eval(f'self.{x}', globals(), {'self': self}) for x in self.all_fields()]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:52:51