Django Annotate Count异常:无已发布场景的演员统计值为1?
问题原因及解决方案
问题根源
你的代码里annotate中Count的filter=Q(state=Scene.State.PUBLISHED)存在字段作用域混淆:
- 当前查询集针对
Actor对象,Q(state=...)默认匹配的是Actor自身的state字段,而非关联场景Scene的state。 - 前面已经通过
filter(state=Actor.State.PUBLISHED)筛选出状态为PUBLISHED的演员,所以这个filter条件对所有选中的Actor都成立。最终Count('scenes')会统计该演员关联的所有场景数量,不管场景本身的状态,这就是为什么仅有PREVIEW场景的演员被算出scenes_cnt=1。
修正代码
需要明确指定统计的是Scene的state为PUBLISHED的场景,将Q(state=...)改为Q(scenes__state=...)(scenes是Actor与Scene的关联字段名):
actors = Actor.objects.filter(state=Actor.State.PUBLISHED)\ .annotate(scenes_cnt=Count('scenes', filter=Q(scenes__state=Scene.State.PUBLISHED)))
验证效果
修正后:
- 无已发布场景的演员,
scenes_cnt会被正确计算为0 - 有已发布场景的演员,会统计对应数量的PUBLISHED场景
内容的提问来源于stack exchange,提问作者Alex Lozovsky
相关产品推荐
相关产品推荐

