You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django如何过滤仅含指定学生的多对多关联组?

解决Django筛选所有学生均为指定first_name的分组问题

你的问题出在filter(students__first_name='Jordan')的逻辑上——这个查询只会返回至少有一个学生叫Jordan的分组,而不会排除那些同时包含非Jordan学生的分组(比如你的Group#2里有Jekson Barnes,依然会被选中)。要筛选出所有学生的first_name都是Jordan的分组,有两种可靠的实现方式:

方法一:排除包含非Jordan学生的分组

直接排除存在first_name不是Jordan的学生的分组,代码如下:

groups = Group.objects.exclude(students__first_name__ne='Jordan')

这个逻辑很直接:只要分组里有任何一个学生的first_name不等于Jordan,就把这个分组排除掉,剩下的就是所有学生都是Jordan的分组。

方法二:通过统计非Jordan学生数量筛选

使用annotate统计每个分组里非Jordan学生的数量,再筛选数量为0的分组,这种方式更直观,也方便扩展其他统计需求:

from django.db.models import Count, Q

groups = Group.objects.annotate(
    non_jordan_students=Count('students', filter=Q(students__first_name__ne='Jordan'))
).filter(non_jordan_students=0)

这里用Count配合filter参数,只统计分组里first_name不等于Jordan的学生数,最后筛选出这个数值为0的分组,就是符合要求的结果。

如果需要同时排除空分组(即没有任何学生的组),可以在查询末尾加上.exclude(students__isnull=True)或者调整统计条件。

内容的提问来源于stack exchange,提问作者Альберт Александров

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:10:42