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

如何从生成器获取单个值?鸡场死亡监控代码问题求助

解决鸡只死亡总数计算的问题

我一眼就看出问题出在哪了,咱们一步步来理清楚:

问题根源

你现在的代码里,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:22:09