Можно ли фильтровать в аннотации?
В моем сознании что-то вроде этого (что на самом деле не работает)
Student.objects.all().annotate(Count('attendance').filter(type="Excused"))
В итоговой таблице будет каждый студент с количеством пропущенных абзацев. Просмотр фильтров документации может быть только до или после аннотации, которая не даст желаемых результатов.
Обходной путь - это
for student in Student.objects.all():
student.num_excused_absence = Attendance.objects.filter(student=student, type="Excused").count()
Это работает, но делает много запросов, в реальном приложении это может оказаться непрактично длинным. Я думаю, что этот тип утверждения возможен в SQL, но, если это возможно, предпочтет остаться с ORM. Я даже попытался сделать два отдельных запроса (один для всех студентов, другой - для получения итогового значения) и объединить их с |. Комбинация изменила общее количество: (
Некоторые мысли после чтения ответов и комментариев
Я решил проблему присутствия, используя дополнительный sql здесь.
- Сообщение блога Тимми было полезно. Мой ответ основан на этом.
- Ответ hash1baby работает, но кажется столь же сложным, как sql. Он также требует выполнения sql, а затем добавления результата в цикл for. Это плохо для меня, потому что я собираю много этих фильтрующих запросов вместе. Мое решение создает большой набор запросов с большим количеством фильтров и дополнительных и выполняет все это сразу.
- Если производительность не проблема, я предлагаю работать цикл for. Это проще всего понять.