2009-07-19 3 views
3

次のM2Mシナリオを考えてみましょう。Djangoモデル - QuerySetを使用してM2Mシナリオで両方のFKで自己結合

私は、任意の学生のすべての同僚とそれらの両方のコースに参加する数を取得したい。

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メソッドを使用してこれを実現します。

ありがとうございます!

+0

この(http://code.djangoproject.com/ticket/8375)私の問題を解決しているだろう。残念ながら、それはいつか/多分状態です。 – ducu

答えて

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'))