Skip to content

Commit 7a2a711

Browse files
Fix N+1 query issue in Grant admin invitation letter flag
Use Django''s Exists annotation in get_queryset() instead of calling has_invitation_letter_request() method for each grant in the admin list. This optimizes the query to use a single SQL query with EXISTS subquery rather than individual queries for each grant row. Co-authored-by: Marco Acierno <[email protected]>
1 parent d04086a commit 7a2a711

File tree

2 files changed

+9
-11
lines changed

2 files changed

+9
-11
lines changed

backend/grants/admin.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -588,9 +588,11 @@ def has_voucher(self, obj: Grant) -> bool:
588588
@admin.display(description="📧", boolean=True)
589589
def has_invitation_letter_request_flag(self, obj: Grant) -> bool:
590590
"""Display flag indicating if user has submitted an invitation letter request"""
591-
return obj.has_invitation_letter_request()
591+
return getattr(obj, 'has_invitation_letter_request', False)
592592

593593
def get_queryset(self, request):
594+
from visa.models import InvitationLetterRequest
595+
594596
qs = (
595597
super()
596598
.get_queryset(request)
@@ -614,6 +616,12 @@ def get_queryset(self, request):
614616
user_id=OuterRef("user_id"),
615617
)
616618
),
619+
has_invitation_letter_request=Exists(
620+
InvitationLetterRequest.objects.filter(
621+
conference_id=OuterRef("conference_id"),
622+
requester_id=OuterRef("user_id"),
623+
)
624+
),
617625
)
618626
)
619627

backend/grants/models.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -333,16 +333,6 @@ def has_approved_accommodation(self):
333333
def current_or_pending_status(self):
334334
return self.pending_status or self.status
335335

336-
def has_invitation_letter_request(self):
337-
"""Check if user has submitted an invitation letter request for this conference"""
338-
if not self.user_id:
339-
return False
340-
341-
from visa.models import InvitationLetterRequest
342-
return InvitationLetterRequest.objects.filter(
343-
conference=self.conference,
344-
requester=self.user
345-
).exists()
346336

347337

348338
class GrantConfirmPendingStatusProxy(Grant):

0 commit comments

Comments
 (0)