Optimize CID lookups to reduce N+1 query pattern in exam review question responses
This commit is contained in:
+11
-2
@@ -287,6 +287,15 @@ def exam_review_question_responses(request, pk: int, q_index: int):
|
|||||||
# candidate try to resolve the CidUser and show CID + name if available. If neither
|
# candidate try to resolve the CidUser and show CID + name if available. If neither
|
||||||
# is present fall back to empty/anonymous.
|
# is present fall back to empty/anonymous.
|
||||||
|
|
||||||
|
# Optimize CID lookups: collect distinct CID values and fetch all CidUser rows
|
||||||
|
# in a single query to avoid an N+1 query pattern.
|
||||||
|
cids_qs = exam_user_answers_qs.values_list("cid", flat=True).distinct()
|
||||||
|
cids = [c for c in cids_qs if c is not None and str(c).strip() != ""]
|
||||||
|
cid_map = {}
|
||||||
|
if cids:
|
||||||
|
for cu in CidUser.objects.filter(cid__in=cids):
|
||||||
|
cid_map[cu.cid] = cu
|
||||||
|
|
||||||
exam_user_answers = []
|
exam_user_answers = []
|
||||||
for ua in exam_user_answers_qs:
|
for ua in exam_user_answers_qs:
|
||||||
# default display
|
# default display
|
||||||
@@ -302,9 +311,9 @@ def exam_review_question_responses(request, pk: int, q_index: int):
|
|||||||
else:
|
else:
|
||||||
name = getattr(user, "username", str(user))
|
name = getattr(user, "username", str(user))
|
||||||
display = name
|
display = name
|
||||||
elif getattr(ua, "cid", None):
|
elif getattr(ua, "cid", None) is not None:
|
||||||
cid_val = ua.cid
|
cid_val = ua.cid
|
||||||
cu = CidUser.objects.filter(cid=cid_val).first()
|
cu = cid_map.get(cid_val)
|
||||||
if cu is not None and cu.name:
|
if cu is not None and cu.name:
|
||||||
display = f"CID{cid_val} ({cu.name})"
|
display = f"CID{cid_val} ({cu.name})"
|
||||||
else:
|
else:
|
||||||
|
|||||||
Reference in New Issue
Block a user