如何动态构建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
相关产品推荐
相关产品推荐

