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和出勤率的查询集,否则为空?

文档提到了左连接,但没有提到右连接。

4

2 回答 2

7

更改表主题的左连接

queryset.query.alias_map['subject'].join_type = "RIGHT OUTER JOIN"
于 2018-08-22T13:24:31.193 回答
4

您可以使用这样的查询:

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

select_relatedJOIN同桌Attendance。Django 没有显式的joinORM 方法,但是JOIN当您调用select_related. 生成的查询集将包含所有Student的参加人数,并且当您attencande_set.all()访问每个学生时 - 不会执行其他查询。检查文档的_set功能

如果您只想查询至少有一次出勤的学生,您可以使用这样的查询:

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 回答