Но я вижу, что это неправильно, поскольку количество учеников должно быть на школу .
Ну, вы будете считать учеников, которые принадлежат к школек которому принадлежит этот учитель, так что это семантически верно.Однако аннотация будет помещена на объекты в наборе запросов, следовательно, на учителя, поэтому вы можете получить количество учеников с помощью:
for teacher in teachers:
print(teacher.name, teacher.school.name, <b>teacher.student_count</b>)
, поскольку несколько учителей могут принадлежать к одной и той же школеаннотирование таким способом может быть лучшей идеей, так как если не оптимизировать, это означает, что вы будете подсчитывать количество учеников в этой школе для каждого учителя.Хотя семантически это ничего не меняет, запрос может занять значительное время.
Вы можете решить использовать .prefetch_related(..)
для данного school
и аннотировать этот набор запросов в Prefetch
object [Django-doc] , это приведет к дополнительным запросам, но менее дорогим.Например:
from django.db.models import Prefetch, Count
teachers = Teacher.objects.prefetch_related(
Prefetch(
'school',
queryset=School.objects.annotate(<b>student_count=Count('student')</b>)
)
)
Тогда вы действительно можете запросить с помощью:
for teacher in teachers:
print(teacher.name, teacher.school.name, <b>teacher.school.student_count</b>)