Skip to content

Commit 4fca335

Browse files
committed
Merge branch 'develop' – Fix three n+1 query issues
2 parents 03b147b + 9c69de1 commit 4fca335

File tree

3 files changed

+30
-7
lines changed

3 files changed

+30
-7
lines changed

api/drf_views.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -668,22 +668,27 @@ def get_serializer_class(self):
668668
def retrieve(self, request, pk=None, *args, **kwargs):
669669
if pk:
670670
try:
671+
FR = Prefetch(
672+
"field_reports",
673+
queryset=FieldReport.objects.prefetch_related("countries", "contacts"),
674+
)
671675
if self.request.user.is_authenticated:
672676
if is_user_ifrc(self.request.user):
673-
instance = Event.objects.get(pk=pk)
677+
instance = Event.objects.prefetch_related(FR).get(pk=pk)
674678
else:
675679
user_countries = (
676680
UserCountry.objects.filter(user=request.user.id)
677681
.values("country")
678682
.union(Profile.objects.filter(user=request.user.id).values("country"))
679683
)
680684
instance = (
681-
Event.objects.exclude(visibility=VisibilityChoices.IFRC)
685+
Event.objects.prefetch_related(FR)
686+
.exclude(visibility=VisibilityChoices.IFRC)
682687
.exclude(Q(visibility=VisibilityChoices.IFRC_NS) & ~Q(countries__id__in=user_countries))
683688
.get(pk=pk)
684689
)
685690
else:
686-
instance = Event.objects.filter(visibility=VisibilityChoices.PUBLIC).get(pk=pk)
691+
instance = Event.objects.prefetch_related(FR).filter(visibility=VisibilityChoices.PUBLIC).get(pk=pk)
687692
# instance = Event.get_for(request.user).get(pk=pk)
688693
except Exception:
689694
raise Http404

api/serializers.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -843,8 +843,8 @@ class Meta:
843843

844844

845845
class MiniFieldReportSerializer(ModelSerializer):
846-
contacts = FieldReportContactSerializer(many=True)
847-
countries = MiniCountrySerializer(many=True)
846+
contacts = FieldReportContactSerializer(many=True, read_only=True)
847+
countries = MiniCountrySerializer(many=True, read_only=True)
848848
epi_figures_source_display = serializers.CharField(source="get_epi_figures_source_display", read_only=True)
849849
visibility_display = serializers.CharField(source="get_visibility_display", read_only=True)
850850

deployments/drf_views.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,15 @@ class ProjectViewset(
424424
Project.objects.select_related(
425425
"user", "modified_by", "project_country", "reporting_ns", "dtype", "regional_project", "primary_sector"
426426
)
427-
.prefetch_related("project_districts", "event", "annual_splits", "secondary_sectors", "project_admin2")
427+
.prefetch_related(
428+
"project_districts",
429+
"event",
430+
"event__appeals",
431+
"event__countries_for_preview",
432+
"annual_splits",
433+
"secondary_sectors",
434+
"project_admin2",
435+
)
428436
.order_by("-modified_at")
429437
.all()
430438
)
@@ -840,7 +848,17 @@ class EmergencyProjectViewSet(
840848
):
841849
queryset = (
842850
EmergencyProject.objects.select_related("created_by", "reporting_ns", "event", "country", "deployed_eru", "modified_by")
843-
.prefetch_related("districts", "activities", "admin2")
851+
.prefetch_related(
852+
"districts",
853+
"admin2",
854+
"event__appeals",
855+
"event__countries_for_preview",
856+
"activities",
857+
"activities__sector",
858+
"activities__action",
859+
"activities__action__supplies",
860+
"activities__points",
861+
)
844862
.order_by("-modified_at")
845863
.all()
846864
)

0 commit comments

Comments
 (0)