如何从生成器获取单个值?鸡场死亡监控代码问题求助
解决鸡只死亡总数计算的问题
我一眼就看出问题出在哪了,咱们一步步来理清楚:
问题根源
你现在的代码里,deaths被赋值成了一个生成器表达式,而不是实际的求和结果。而且更关键的是,你把sum()放在了生成器的内部,每次迭代单个cd.count的时候调用sum()——但cd.count是一个整数,sum()需要的是可迭代对象,这就是你调用next(deaths)时触发"int对象不可迭代"错误的原因。
修复后的基础代码
把sum()移到生成器表达式外面,直接对所有cd.count的值求和:
from datetime import datetime today = datetime.date.today() # 正确写法:sum接收生成器表达式,遍历每个cd的count值求和 deaths = sum(cd.count for cd in ChickenDeath.objects.filter(date__gte=datetime.date(today.year, today.month, 1))) print(deaths)
为什么这样能行?
cd.count for cd in ChickenDeath.objects.filter(...)是一个生成器表达式,它会逐个取出查询集中每个ChickenDeath对象的count字段值。sum()会遍历这个生成器里的所有数值,把它们加起来,最终返回一个整数——这正是你想要的死亡总数。
额外优化建议(更高效的数据库层面求和)
如果你的ChickenDeath模型里的count是记录每次死亡数量的字段,其实可以用Django ORM自带的聚合函数直接在数据库层面完成求和,效率会更高(不用把所有对象都加载到内存里):
from django.db.models import Sum from datetime import datetime today = datetime.date.today() # 使用ORM的Sum聚合,直接从数据库获取总和,避免内存加载大量对象 deaths = ChickenDeath.objects.filter(date__gte=datetime.date(today.year, today.month, 1)).aggregate(total_deaths=Sum('count'))['total_deaths'] or 0 print(deaths)
这样做的好处是,数据库会帮你完成求和运算,只返回一个结果,尤其是当养鸡场的死亡记录数据量很大时,这种方式的性能优势会很明显。
内容的提问来源于stack exchange,提问作者Lorenzo Ang
相关产品推荐
相关产品推荐

