获得子查询的计数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获得子查询的计数相关的知识,希望对你有一定的参考价值。

我想用子查询过滤器在我的查询集中注释一个计数字段:

我的代码:

 module_attempts = Subquery(ModuleProgressAttempt.objects.filter(
                module_progress__module__id=OuterRef('pk')).only('pk'))        
    real_instances = VirtualClassRoomModule.objects.filter(
        id__in=[vc.id for vc in vc_classrooms]).annotate(
        attendees_count=Count(module_attempts),
        )

这里module_progress__module__id是注释迭代的当前VirtualClassRoomModule的ID。该计数基本上是ModuleProgressAttempt过滤查询集的长度。当前的计数始终为1,尽管

 ModuleProgressAttempt.objects.filter(
                    module_progress__module__id=<Current-module-id>)

返回多个对象。

答案

此解决方案对我有用:

 module_attempts_count = Subquery(ModuleProgressAttempt.objects.filter(
            module_progress__module__id=OuterRef('id')).values('module_progress__module__id')
            .annotate(cnt=Count('id')).values('cnt'))
        real_instances = VirtualClassRoomModule.objects.filter(
            id__in=[vc.id for vc in vc_classrooms]).annotate(
            attendees_count=module_attempts_count,
            )

以上是关于获得子查询的计数的主要内容,如果未能解决你的问题,请参考以下文章

获取子查询的计数

如何在 Gorm 中留下连接子查询计数

哪个最快?计数子查询或分组依据

没有子查询的 MySQL 显示计数

与行号计数相关的子查询

访问:使用子查询中的计数更新查询 - 错误或所有结果