Модели Django - самостоятельное соединение на обоих FK в сценарии M2M с использованием QuerySet - PullRequest
3 голосов
/ 20 июля 2009

Давайте рассмотрим следующий сценарий 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.

Спасибо!

1 Ответ

1 голос
/ 16 марта 2011
colleagues = Student.objects.filter(course_set__students=your_student).exclude(id=your_student).distinct()

Добавить свойство courses_cnt каждому ученику:

colleagues = colleagues.annotate(courses_cnt = Count('attendance_set'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...