【问题标题】:Django models - self join on both FK in a M2M scenario using QuerySetDjango 模型 - 在 M2M 场景中使用 QuerySet 在两个 FK 上自连接
【发布时间】:2010-11-12 04:11:19
【问题描述】:

让我们看看下面的 M2M 场景。

我想获取任何给定学生的所有同事,以及他们都参加的课程数量。 (表示给定学生与他的每一位同事有多少相同的课程。)

class Student(models.Model):
    pass

class Course(models.Model):
    students = models.ManyToManyField(Student, through='Attendance')

class Attendance(models.Model):
    student = models.ForeignKey(Student)
    course = models.ForeignKey(Course)

查询看起来像这样

SELECT 
    S.id AS student_id, 
    A2.student_id AS colleague_id, 
    COUNT(A2.course_id) AS number_of_courses_both_of_them_attend
FROM student S
JOIN attendance A1 
    ON S.id = A1.student_id
JOIN attendance A2 
    ON (A1.course_id = A2.course_id AND A1.student_id != A2.student_id)
GROUP BY 1, 2

如果有任何关于如何使用 QuerySet 方法完成此任务的提示,我将不胜感激。

谢谢!

【问题讨论】:

标签: django-models join count


【解决方案1】:
colleagues = Student.objects.filter(course_set__students=your_student).exclude(id=your_student).distinct()

为每个学生添加 courses_cnt 属性:

colleagues = colleagues.annotate(courses_cnt = Count('attendance_set'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2016-01-07
    相关资源
    最近更新 更多