Skip to content

Commit 018d328

Browse files
committed
Fix PublicPerProcessStatusViewSet N+1 query issue
1 parent 5d8f560 commit 018d328

2 files changed

Lines changed: 43 additions & 3 deletions

File tree

assets

per/drf_views.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -630,7 +630,27 @@ class PerProcessStatusViewSet(viewsets.ReadOnlyModelViewSet):
630630
get_filtered_queryset = RegionRestrictedAdmin.get_filtered_queryset
631631

632632
def get_queryset(self):
633-
queryset = Overview.objects.order_by("country", "-assessment_number", "-date_of_assessment")
633+
queryset = (
634+
Overview.objects.order_by("country", "-assessment_number", "-date_of_assessment")
635+
.select_related("country", "country__region", "type_of_assessment")
636+
.prefetch_related(
637+
Prefetch(
638+
"perassessment_set",
639+
queryset=PerAssessment.objects.order_by("-id").only("id", "overview_id"),
640+
to_attr="latest_perassessments",
641+
),
642+
Prefetch(
643+
"formprioritization_set",
644+
queryset=FormPrioritization.objects.order_by("-id").only("id", "overview_id"),
645+
to_attr="latest_prioritizations",
646+
),
647+
Prefetch(
648+
"perworkplan_set",
649+
queryset=PerWorkPlan.objects.order_by("-id").only("id", "overview_id"),
650+
to_attr="latest_workplans",
651+
),
652+
)
653+
)
634654
return self.get_filtered_queryset(self.request, queryset, dispatch=0)
635655

636656

@@ -640,7 +660,27 @@ class PublicPerProcessStatusViewSet(viewsets.ReadOnlyModelViewSet):
640660
ordering_fields = "__all__"
641661

642662
def get_queryset(self):
643-
return Overview.objects.order_by("country", "-assessment_number", "-date_of_assessment")
663+
return (
664+
Overview.objects.order_by("country", "-assessment_number", "-date_of_assessment")
665+
.select_related("country", "country__region", "type_of_assessment")
666+
.prefetch_related(
667+
Prefetch(
668+
"perassessment_set",
669+
queryset=PerAssessment.objects.order_by("-id").only("id", "overview_id"),
670+
to_attr="latest_perassessments",
671+
),
672+
Prefetch(
673+
"formprioritization_set",
674+
queryset=FormPrioritization.objects.order_by("-id").only("id", "overview_id"),
675+
to_attr="latest_prioritizations",
676+
),
677+
Prefetch(
678+
"perworkplan_set",
679+
queryset=PerWorkPlan.objects.order_by("-id").only("id", "overview_id"),
680+
to_attr="latest_workplans",
681+
),
682+
)
683+
)
644684

645685

646686
class FormAssessmentViewSet(viewsets.ModelViewSet):

0 commit comments

Comments
 (0)