获得子查询的计数
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,
)
以上是关于获得子查询的计数的主要内容,如果未能解决你的问题,请参考以下文章