我想用子查询过滤器在我的查询集中注释一个计数字段:
我的代码:
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,
)