如何通过查询集(逐个对象)获取每个对象的总和

Posted

技术标签:

【中文标题】如何通过查询集(逐个对象)获取每个对象的总和【英文标题】:how to get sum of every objects by queryset (object by object ) 【发布时间】:2021-01-14 13:05:03 【问题描述】:

我对“聚合”和“注释”没有经验,最好用例子说话 我有这个对象:

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)

【问题讨论】:

能否提供相关型号? MediaSecDegrayComany? 我现在设置它.. 【参考方案1】:

我试试这个查询集:

        test1 = MediaSec.objects.filter(date__range=[primary1, primary2], degraycomany__in=degraycompsec).values('degraycomany_id').annotate(total_price=Sum('nomberhisas'))

Ruslt 来了:

<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]>

这离我想要的也许有帮助

【讨论】:

也将日期添加到值中,如果您希望它也按日期聚合

以上是关于如何通过查询集(逐个对象)获取每个对象的总和的主要内容,如果未能解决你的问题,请参考以下文章

从 Django 获取多个随机对象时,查询集如何工作?

如何使用 Spring 响应式通过增量进度更新逐个处理每个产品?

Mongoose:通过 findOneAndUpdate 查询使用对象数组的总和更新根数据属性不起作用

Mongoose:通过 findOneAndUpdate 查询使用嵌套对象数组的总和更新父子数据属性不起作用

如何将结果集的多个值获取到 Java 对象中

Django:通过注释字段的总和订购查询集?