Django聚合函数在Shell与请求端点返回异常:coroutine不可下标访问
问题分析与解决
你的问题出在异步上下文未正确处理ORM调用,结合Shell正常、视图报错的差异,具体原因和解决办法如下:
核心原因
如果你的视图是用async def定义的异步视图,而Product.objects使用了Django的异步管理器(AsyncManager),那么aggregate()方法是异步的,会返回一个协程(coroutine)对象,直接对其下标访问就会触发'coroutine' object is not subscriptable错误。而Django Shell默认处于同步环境,调用的是同步管理器的aggregate(),直接返回字典,所以正常工作。
解决办法
异步视图中添加
await关键字
对异步ORM方法调用添加await,获取实际的聚合结果字典:from django.shortcuts import render from django.db.models.aggregates import Max from .models.product import Product async def product_page(request): # 添加await获取异步方法的返回结果 agg = await Product.objects.aggregate(max__price=Max('price')) return render(request, 'product.html', {'max_price': agg['max__price']})检查代码拼写错误
你提供的代码中存在笔误:aaggregate应该改为aggregate(多了一个字母a),这个错误会直接导致属性不存在异常,务必确认实际代码中的方法名正确。
补充说明
如果你的视图是同步视图(用def定义)却出现这个错误,大概率是误将同步ORM操作包装成了异步任务,或者错误使用了异步数据库连接,此时只需确保视图和ORM调用的同步/异步属性一致即可。
内容的提问来源于stack exchange,提问作者Lekhnath
相关产品推荐
相关产品推荐

