python - 如何通过查询集(逐个对象)获取每个对象的总和
问题描述
我没有'聚合'和'注释'的经验,并且更好地与示例交谈我有这个对象:
mediasec = MediaSec.objects.filter(date__range=[primary1, primary2], degraycomany__in=degraycompsec)
如果我在将其转换为列表后打印它并循环将得到这个字典:
{'id': 5, 'degraycomany_id': 5, 'nomberhisas': 3, 'date': datetime.date(2020, 9, 25)}
{'id': 8, 'degraycomany_id': 5, 'nomberhisas': 1, 'date': datetime.date(2020, 9, 27)}
{'id': 9, 'degraycomany_id': 5, 'nomberhisas': 1, 'date': datetime.date(2020, 9, 27)}
{'id': 10, 'degraycomany_id': 5, 'nomberhisas': 1, 'date': datetime.date(2020, 9, 27)}
{'id': 13, 'degraycomany_id': 5, 'nomberhisas': 3, 'date': datetime.date(2020, 9, 28)}
{'id': 7, 'degraycomany_id': 6, 'nomberhisas': 2, 'date': datetime.date(2020, 9, 27)}
{'id': 11, 'degraycomany_id': 6, 'nomberhisas': 1, 'date': datetime.date(2020, 9, 27)}
{'id': 6, 'degraycomany_id': 7, 'nomberhisas': 1, 'date': datetime.date(2020, 9, 27)}
{'id': 12, 'degraycomany_id': 7, 'nomberhisas': 1, 'date': datetime.date(2020, 9, 28)}
{'id': 14, 'degraycomany_id': 7, 'nomberhisas': 3, 'date': datetime.date(2020, 9, 28)}
{'id': 15, 'degraycomany_id': 8, 'nomberhisas': 1, 'date': datetime.date(2020, 9, 28)}
所以现在我想得到每个 degraycomany_id 的总和,所以我使用这个查询集:
test1 = MediaSec.objects.filter(date__range=[primary1, primary2], degraycomany__in=degraycompsec).aggregate(Sum("nomberhisas"))
结果来了:
{'nomberhisas__sum': 18}
我想要这样的结果:
{'id': 13, 'degraycomany_id': 5, 'nomberhisas': 9, 'date': datetime.date(2020, 9, 28)}
{'id': 11, 'degraycomany_id': 6, 'nomberhisas': 3, 'date': datetime.date(2020, 9, 27)}
{'id': 14, 'degraycomany_id': 7, 'nomberhisas': 5, 'date': datetime.date(2020, 9, 28)}
{'id': 15, 'degraycomany_id': 8, 'nomberhisas': 1, 'date': datetime.date(2020, 9, 28)}
我想在每个“degraycomany_id”中获得“nomberhisas”的总和,而不是所有对象的总和
型号:
class MediaSec(models.Model):
degraycomany = models.ForeignKey(DegreyCompany, on_delete=models.CASCADE)
nomberhisas = models.SmallIntegerField()
date = models.DateField()
update_at = models.DateTimeField(auto_now_add=True, blank=1, null=1)
created_at = models.DateTimeField(auto_now_add=True)
class DegreyCompany(models.Model):
withdegrey = models.ForeignKey(Degrey, on_delete=models.CASCADE, null=True, blank=True)
company = models.ForeignKey(Secondary, on_delete=models.CASCADE, null=True, blank=True)
spesial = models.ForeignKey('Spesial', on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length=200, default=withdegrey.name, null=True, blank=True)
nomberetud = models.PositiveSmallIntegerField(null=True, blank=True)
nomberexist = models.PositiveSmallIntegerField(null=True, blank=True)
femail = models.PositiveSmallIntegerField(null=True, blank=True)
reatrap = models.PositiveSmallIntegerField(null=True, blank=True)
解决方案
我试试这个查询集:
test1 = MediaSec.objects.filter(date__range=[primary1, primary2], degraycomany__in=degraycompsec).values('degraycomany_id').annotate(total_price=Sum('nomberhisas'))
锈迹斑斑的来了:
<QuerySet [{'degraycomany_id': 5, 'total_price': 9}, {'degraycomany_id': 6, 'total_price': 3}, {'degraycomany_id': 7, 'total_price': 5}, {'degraycomany_id': 8, 'total_price': 1}]>
这离我想要的很近,也许有帮助
推荐阅读
- vba - 插入单元格值性能
- android - Android - 是否可以以编程方式访问 androidTest 和测试文件夹中的仪器测试和单元测试类?
- python - 用 Python 操作 Excel
- c++ - 如何通过创建新的 ssh 连接来修复错误?
- javascript - 更新到版本 < 24.0.0 后测试不再起作用
- python - 将 Sendmail 日志文件加载到 pandas
- java - Google Play inapp 订阅:如何知道用户是否已经有 7 天的免费测试期?
- angular - proxy.config.json 用法——基础理解
- laravel - 此表或该表中存在 Laravel 验证
- if-statement - “iif”条件不适用于 SSRS 中的计算字段