首页 > 解决方案 > 获取子查询的计数

问题描述

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

我的代码:

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

返回多个对象。

标签: djangodjango-querysetdjango-annotate

解决方案


这个解决方案对我有用:

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,
)

推荐阅读