Python异步函数生成指定列表时遇AttributeError问题求助
问题分析与解决方案
核心问题
你遇到的AttributeError: 'list' object has no attribute 'dict'以及无法生成目标列表的问题,主要源于以下几个代码缺陷:
- 参数类型不匹配:路由传入的是
list[OrderPSchema](Pydantic模型列表),但仓库函数order_id_product的参数标注为list[dict],类型定义错误导致后续处理逻辑混乱。 - 提前终止循环:循环内第一次迭代就执行
return,仅返回单个结果,无法生成多元素列表。 - 事务提交时机错误:每次循环都提交事务,既影响效率,也不符合批量操作的最佳实践。
- 结果转换缺失:直接返回ORM对象列表,FastAPI尝试序列化时会调用
.dict()方法,但列表本身没有该属性,导致报错。
修正后的代码实现
仓库层函数修正
async def order_id_product(self, order_id: int, aos: Optional[list[OrderPSchema]]): result_list = [] if aos: for a in aos: # 查询商品信息 product_res = await self._session.execute(select(Product).where(Product.id == a.product_id)) product = product_res.scalars().first() # 处理商品不存在的边界情况 if not product: continue # 插入OrderProduct并返回结果 order_product_result = await self._session.execute( insert(OrderProduct) .values( order_id=order_id, product_id=product.id, vendor_id=product.vendor_id, quantity=a.quantity ) .returning(OrderProduct) ) order_product = order_product_result.first() # 转换为目标Schema结构并收集结果 result_list.append(OrderPSchema(product_id=order_product.product_id, quantity=order_product.quantity)) # 批量提交事务 await self._session.commit() return result_list
路由层代码修正
(修复多余的括号错误)
@routers.post('/', status_code=status.HTTP_201_CREATED) async def order(aos: Optional[list[OrderPSchema]], order_id: int, db: AsyncSession = Depends(get_db)): return await OrderRepository(session=db).order_id_product(aos=aos, order_id=order_id)
说明
你的需求完全可以实现,修正后的代码会:
- 接收Pydantic模型列表作为输入
- 批量处理每个商品的插入逻辑
- 将插入后的结果转换为
OrderPSchema结构的列表返回 - 统一提交事务,提升操作效率
内容的提问来源于stack exchange,提问作者pythonGo
相关产品推荐
相关产品推荐

