Python 如何让所有学生报名参加一系列特定课程,比如(1和2)的多对多关系

Python 如何让所有学生报名参加一系列特定课程,比如(1和2)的多对多关系,python,django,django-models,many-to-many,django-queryset,Python,Django,Django Models,Many To Many,Django Queryset,我试图让所有注册的学生都参加一系列特定的课程(比如课程1和课程2) 如果我这样做: result = Student.objects.filter(courses__in=[1,2]) 我得到了所有选修课程1或课程2的学生。 我只对这两门课程都注册的学生感兴趣 下面的代码可以工作,但我认为这不是实现这一点的最佳方法: all_students = Student.objects.all() stud_id = [] for student in all_students: course

我试图让所有注册的学生都参加一系列特定的课程(比如课程1和课程2)

如果我这样做:

result = Student.objects.filter(courses__in=[1,2])
我得到了所有选修课程1或课程2的学生。 我只对这两门课程都注册的学生感兴趣

下面的代码可以工作,但我认为这不是实现这一点的最佳方法:

all_students = Student.objects.all()
stud_id = []
for student in all_students:
    course_list = list(student.courses.values_list('pk', flat=True))
    check = all(item in course_list for item in [1,2])
    if check:
        stud_id.append(student.id)
studs = Student.objects.filter(id__in=stud_id)
这样做的目的是,不要对每个学生进行反复检查,以确定他们是否参加了给定的一套课程。

有几件事

(1) 您的学生模型课程的
相关名称
有点令人困惑。相关名称的概念是能够从没有定义replationship的模型中“向后”查找定义关系的模型。在这里,您希望能够从您的
课程
模型开始,并使用该
相关名称
获取课程中的学生列表。因此,我推荐
related\u name=“course\u name”
,而不是
related\u name=“students”

(2) 后缀中的
\u确实与列表中的任何内容匹配。如果两者都需要,则必须显式地对两者进行筛选。因此,您的查询将是:

result = Student.objects.filter(courses__id=1).filter(courses__id=2)

这应该只返回两门课程的学生。

如@Ashley H.所示,但是:

result = Student.objects.filter(courses__id=1).filter(courses__id=2)
因此,如果我们有:

Joe Ben: Math, Computing, Machine Learning
Ray Youth: Math, Computing
Elli Vader: Computing

结果将是:乔·本,雷·杨。我想这就是我们需要的。如果没有,你能纠正我吗?

我同意相关名称中的混淆。但是,当我尝试执行步骤2时,我得到了错误:
SyntaxError:keyword参数repeated:courses\uu id
Yep,很抱歉-@mseromenho有解决方案,我将更新我的答案。同意,mseromenho已经找到了解决方案,希望OP@AkshayJain会将答案归功于他。@AkshayJain请不要忘记选择我的答案作为解决方案,如果它有帮助的话。此外,堆叠多个ORM过滤器会转化为一个包含一堆内部联接的查询,每个过程一个。所以,仍然很好。这正是我需要的,抱歉@mseromenho没有选择您的答案作为解决方案。
Joe Ben: Math, Computing, Machine Learning
Ray Youth: Math, Computing
Elli Vader: Computing