7

ここに私のモデルがあります

class Student:
    user  = ForeignKey(User)
    department = IntegerField()
    semester = IntegerField()
    ...

class Attendance:
    student = ForeignKey(Student)
    subject = ForeignKey(Subject)
    month = IntegerField()
    year = IntergerField()
    present = IntegerField() 
    total = IntegerField()

students = Student.objects.filter(semester=semester)

StudentAttendanceモデルの間で適切な結合を実行するにはどうstudentsすればよいですか? 学生用に存在する場合はすべての and 出席者`、そうでない場合は null を含むクエリセットを取得できますか?

ドキュメントでは、左結合については言及されていますが、右結合については言及されていません。

4

2 に答える 2

4

このようなクエリを使用できます。

queryset = Student.objects.all().select_related('attendance_set')
student = queryset[0]
# all attendances for the student
attendances = student.attendance_set.all() 

select_relatedあなたとJOIN一緒にAttendanceテーブルに。Django には明示的なjoinORM メソッドはありませんがJOIN、 を呼び出すと内部的に行われますselect_related。結果のクエリセットには、出席者が結合されたすべての が含まれ、各学生Studentを呼び出す場合、追加のクエリは実行されません。機能についてはドキュメントをattencande_set.all()確認してください。_set

少なくとも 1 回出席している学生のみを照会する場合は、次のようなクエリを使用できます。

from django.models import Count
(Student.objects.all()
                .select_related('attendance_set')
                .annotate(n_attendances=Count('attendance_set'))
                .filter(n_attendances__gt=0))
于 2014-12-16T17:19:19.307 に答える