Вы правы - django не позволяет фильтровать подсчитываемые связанные объекты, не применяя фильтр к первичным объектам и, следовательно, исключая те первичные объекты, которые не имеют связанных объектов после фильтрации.
Но при небольшой утечке абстракции можно подсчитывать группы с помощью запроса значений.
Итак, я собираю пропуски в словаре и использую их в цикле. Как то так:
# a query for students
students = Students.objects.all()
# a query to count the student attendances, grouped by type.
attendance_counts = Attendence(student__in=students).values('student', 'type').annotate(abs=Count('pk'))
# regroup that into a dictionary {student -> { type -> count }}
from itertools import groupby
attendance_s_t = dict((s, (dict(t, c) for (s, t, c) in g)) for s, g in groupby(attendance_counts, lambda (s, t, c): s))
# then use them efficiently:
for student in students:
student.absences = attendance_s_t.get(student.pk, {}).get('Excused', 0)