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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:03:22