File "/usr/local/lib/python3.11/site-packages/beanie/odm/queries/cursor.py", line 73, in to_list motor_list = await cursor.to_list(length) ^^^^^^^^^^^^^^ AttributeError: 'coroutine' object has no attribute 'to_list'
时间: 2025-08-09 14:03:02 浏览: 3
在使用 Beanie 时,如果遇到 `AttributeError: 'coroutine' object has no attribute 'to_list'` 这样的错误,通常是因为对异步查询的结果处理方式不当。Beanie 的 `find()` 方法返回的是一个异步生成器(async generator)或协程(coroutine),而不是可以直接调用 `.to_list()` 的对象。正确的做法是使用 `await` 来解析查询结果,或者将结果转换为列表时使用 `to_list()` 方法,但必须确保在异步上下文中调用。
例如,以下代码会引发该错误:
```python
results = Product.find(Product.price > 500).to_list()
```
因为 `find()` 返回的是一个协程对象,而 `.to_list()` 是在该协程上定义的方法,必须通过 `await` 来获取该协程的结果:
```python
results = await Product.find(Product.price > 500).to_list()
```
这样修改后,代码将在异步环境中正确执行查询并将结果转换为列表[^2]。
此外,确保所有涉及 Beanie 模型的操作都在异步函数中执行,并且正确地使用 `await` 关键字,以避免类似的异步错误。
### 解决方案
1. **确保使用 `await`**:在调用任何 Beanie 的查询方法时,确保使用 `await` 来等待结果。
2. **检查异步上下文**:确认当前函数是异步函数(使用 `async def` 定义),并且在调用异步方法时使用了 `await`。
3. **避免同步上下文中调用异步方法**:如果在同步代码中需要调用异步方法,可以使用 `asyncio.run()` 或其他异步事件循环机制来执行异步函数。
### 示例代码
```python
async def get_expensive_products():
expensive_products = await Product.find(Product.price > 500).to_list()
return expensive_products
```
这段代码定义了一个异步函数 `get_expensive_products`,它使用 `await` 来等待查询结果,并通过 `to_list()` 将结果转换为列表[^2]。
阅读全文