Enhance ExamCollectionDetail queryset to prefetch related exams and annotate candidate counts for improved performance in templates
This commit is contained in:
@@ -5875,6 +5875,68 @@ class ExamCollectionList(LoginRequiredMixin, ListView):
|
||||
|
||||
class ExamCollectionDetail(AuthorRequiredMixin, DetailView):
|
||||
model = ExamCollection
|
||||
|
||||
def get_queryset(self):
|
||||
# Prefetch related exam sets and annotate candidate counts to avoid per-exam DB hits in templates
|
||||
qs = super().get_queryset()
|
||||
try:
|
||||
from anatomy.models import Exam as AnatomyExam
|
||||
from longs.models import Exam as LongsExam
|
||||
from rapids.models import Exam as RapidsExam
|
||||
from shorts.models import Exam as ShortsExam
|
||||
from physics.models import Exam as PhysicsExam
|
||||
from sbas.models import Exam as SbasExam
|
||||
|
||||
qs = qs.prefetch_related(
|
||||
Prefetch(
|
||||
'anatomy_exams',
|
||||
queryset=AnatomyExam.objects.annotate(
|
||||
valid_cid_users_count=Count('valid_cid_users'),
|
||||
valid_user_users_count=Count('valid_user_users'),
|
||||
).prefetch_related('author'),
|
||||
),
|
||||
Prefetch(
|
||||
'longs_exams',
|
||||
queryset=LongsExam.objects.annotate(
|
||||
valid_cid_users_count=Count('valid_cid_users'),
|
||||
valid_user_users_count=Count('valid_user_users'),
|
||||
).prefetch_related('author'),
|
||||
),
|
||||
Prefetch(
|
||||
'rapids_exams',
|
||||
queryset=RapidsExam.objects.annotate(
|
||||
valid_cid_users_count=Count('valid_cid_users'),
|
||||
valid_user_users_count=Count('valid_user_users'),
|
||||
).prefetch_related('author'),
|
||||
),
|
||||
Prefetch(
|
||||
'shorts_exams',
|
||||
queryset=ShortsExam.objects.annotate(
|
||||
valid_cid_users_count=Count('valid_cid_users'),
|
||||
valid_user_users_count=Count('valid_user_users'),
|
||||
).prefetch_related('author'),
|
||||
),
|
||||
Prefetch(
|
||||
'physics_exams',
|
||||
queryset=PhysicsExam.objects.annotate(
|
||||
valid_cid_users_count=Count('valid_cid_users'),
|
||||
valid_user_users_count=Count('valid_user_users'),
|
||||
).prefetch_related('author'),
|
||||
),
|
||||
Prefetch(
|
||||
'sbas_exams',
|
||||
queryset=SbasExam.objects.annotate(
|
||||
valid_cid_users_count=Count('valid_cid_users'),
|
||||
valid_user_users_count=Count('valid_user_users'),
|
||||
).prefetch_related('author'),
|
||||
),
|
||||
'author',
|
||||
)
|
||||
except Exception:
|
||||
# If any app is missing or import fails, fall back to default queryset
|
||||
pass
|
||||
|
||||
return qs
|
||||
|
||||
|
||||
class ExamCollectionEdit(AuthorRequiredMixin, UpdateView):
|
||||
|
||||
Reference in New Issue
Block a user