Skip to content

Commit 08242a3

Browse files
committed
Fix multiple user queries n+1 issue
1 parent 9c69de1 commit 08242a3

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
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):

0 commit comments

Comments
 (0)