From 0cd15b2b8dfca585a19e8b9da76039cbc112a475 Mon Sep 17 00:00:00 2001 From: "Szabo, Zoltan" Date: Sat, 29 Jun 2024 18:45:57 +0200 Subject: [PATCH] Fix event-pk query n+1 selects --- api/drf_views.py | 15 ++++++++++++--- api/serializers.py | 4 ++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/api/drf_views.py b/api/drf_views.py index 3172d5e8c6..fe6a5929ff 100644 --- a/api/drf_views.py +++ b/api/drf_views.py @@ -668,9 +668,13 @@ def get_serializer_class(self): def retrieve(self, request, pk=None, *args, **kwargs): if pk: try: + FR = Prefetch( + "field_reports", + queryset=FieldReport.objects.prefetch_related("countries", "contacts"), + ) if self.request.user.is_authenticated: if is_user_ifrc(self.request.user): - instance = Event.objects.get(pk=pk) + instance = Event.objects.prefetch_related(FR).get(pk=pk) else: user_countries = ( UserCountry.objects.filter(user=request.user.id) @@ -678,12 +682,17 @@ def retrieve(self, request, pk=None, *args, **kwargs): .union(Profile.objects.filter(user=request.user.id).values("country")) ) instance = ( - Event.objects.exclude(visibility=VisibilityChoices.IFRC) + Event.objects.prefetch_related(FR) + .exclude(visibility=VisibilityChoices.IFRC) .exclude(Q(visibility=VisibilityChoices.IFRC_NS) & ~Q(countries__id__in=user_countries)) .get(pk=pk) ) else: - instance = Event.objects.filter(visibility=VisibilityChoices.PUBLIC).get(pk=pk) + instance = ( + Event.objects.prefetch_related(FR) + .filter(visibility=VisibilityChoices.PUBLIC) + .get(pk=pk) + ) # instance = Event.get_for(request.user).get(pk=pk) except Exception: raise Http404 diff --git a/api/serializers.py b/api/serializers.py index e950931ece..8bce833dbd 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -843,8 +843,8 @@ class Meta: class MiniFieldReportSerializer(ModelSerializer): - contacts = FieldReportContactSerializer(many=True) - countries = MiniCountrySerializer(many=True) + contacts = FieldReportContactSerializer(many=True, read_only=True) + countries = MiniCountrySerializer(many=True, read_only=True) epi_figures_source_display = serializers.CharField(source="get_epi_figures_source_display", read_only=True) visibility_display = serializers.CharField(source="get_visibility_display", read_only=True)