基于ORM过滤器的Django自定义计数

时间:2019-10-04 09:01:10

标签: django django-queryset

我正在尝试根据以前过滤的数据收集其他信息,例如

count(distinct batch_id) as batches,
sum(files) as files

结果受先前过滤的影响

.filter(batch_id__gte=165)

我试图克隆QuerySet并注释上面的SQL

.annotate(
        batches=Count('batch_id', distinct=True),
        batch_files=Sum('files')
    )

但这不起作用,因为随后将SQL附加到现有的SELECT查询中

在保留WHERE部分的同时,是否有一种简单的方法来获取带有自定义SELECT部分​​的第二个查询?

1 个答案:

答案 0 :(得分:0)

您可能想改为aggregate(..) [Django-doc],例如:

result = Model.objects.filter(batch_id__gte=165).aggregate(
    batches=Count('batch_id', distinct=True),
    batch_files=Sum('files')
)

result是包含两个键的字典:'batches''batch_files'分别包含Count('batch_id', distinct=True)Sum('files')

注释表示您将对整个对象 进行属性计算,而不是对整个查询集进行计算,而 aggregating 表示您将对整个(过滤后的)查询集进行计算。< / p>

相关问题