Skip to content

Commit aea0dbc

Browse files
Merge pull request #2189 from IFRCGo/feature/user-query-nplus1
Fix multiple user queries n+1 issue
2 parents 9c69de1 + c1cba50 commit aea0dbc

File tree

3 files changed

+25
-7
lines changed

3 files changed

+25
-7
lines changed

api/drf_views.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from datetime import timedelta
22

3-
from django.contrib.auth.models import User
3+
from django.contrib.auth.models import Group, User
44
from django.db import models
55
from django.db.models import (
66
Avg,
@@ -1297,7 +1297,23 @@ class UsersViewset(viewsets.ReadOnlyModelViewSet):
12971297
filterset_class = UserFilterSet
12981298

12991299
def get_queryset(self):
1300-
return User.objects.filter(is_active=True)
1300+
1301+
return (
1302+
User.objects.select_related(
1303+
"profile",
1304+
"profile__country",
1305+
)
1306+
.prefetch_related("subscription")
1307+
.annotate(
1308+
is_ifrc_admin=models.Exists(
1309+
Group.objects.filter(
1310+
name__iexact="IFRC Admins",
1311+
user=OuterRef("pk"),
1312+
)
1313+
)
1314+
)
1315+
.filter(is_active=True)
1316+
)
13011317

13021318

13031319
class GlobalEnumView(APIView):

api/serializers.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1616,7 +1616,7 @@ class Meta:
16161616
class UserSerializer(ModelSerializer):
16171617
profile = ProfileSerializer()
16181618
subscription = MiniSubscriptionSerializer(many=True)
1619-
is_ifrc_admin = serializers.SerializerMethodField()
1619+
is_ifrc_admin = serializers.BooleanField(read_only=True)
16201620

16211621
class Meta:
16221622
model = User
@@ -1654,9 +1654,11 @@ def update(self, instance, validated_data):
16541654
instance.save()
16551655
return instance
16561656

1657-
@staticmethod
1658-
def get_is_ifrc_admin(obj) -> bool:
1659-
return obj.groups.filter(name__iexact="IFRC Admins").exists()
1657+
1658+
# Instead of the below method we use the serializer's annotate tag:
1659+
# @staticmethod
1660+
# def get_is_ifrc_admin(obj) -> bool:
1661+
# return obj.groups.filter(name__iexact="IFRC Admins").exists()
16601662

16611663

16621664
class UserNameSerializer(UserSerializer):

per/drf_views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ def get_queryset(self):
193193
return (
194194
FormQuestion.objects.all()
195195
.order_by("component__component_num", "question_num", "question")
196-
.select_related("component")
196+
.select_related("component", "component__area")
197197
.prefetch_related("answers")
198198
)
199199

0 commit comments

Comments
 (0)