From 480c07ed126a9d498912d2c6a9685f974d55e7a0 Mon Sep 17 00:00:00 2001 From: Johannes Christ Date: Fri, 15 Dec 2023 17:05:07 +0100 Subject: Prefetch user and actor in expanded infraction view Prevent N+1 reported by Sentry: https://python-discord.sentry.io/issues/4721126467/?project=2714379&query=is%3Aunresolved&referrer=issue-stream&statsPeriod=90d&stream_index=3 --- pydis_site/apps/api/serializers.py | 9 ++------- pydis_site/apps/api/viewsets/bot/infraction.py | 6 +++++- 2 files changed, 7 insertions(+), 8 deletions(-) (limited to 'pydis_site/apps/api') diff --git a/pydis_site/apps/api/serializers.py b/pydis_site/apps/api/serializers.py index d7cdfd7e..cfd975c9 100644 --- a/pydis_site/apps/api/serializers.py +++ b/pydis_site/apps/api/serializers.py @@ -505,13 +505,8 @@ class ExpandedInfractionSerializer(InfractionSerializer): """Return the dictionary representation of this infraction.""" ret = super().to_representation(instance) - user = User.objects.get(id=ret['user']) - user_data = UserSerializer(user).data - ret['user'] = user_data - - actor = User.objects.get(id=ret['actor']) - actor_data = UserSerializer(actor).data - ret['actor'] = actor_data + ret['user'] = UserSerializer(instance.user).data + ret['actor'] = UserSerializer(instance.actor).data return ret diff --git a/pydis_site/apps/api/viewsets/bot/infraction.py b/pydis_site/apps/api/viewsets/bot/infraction.py index 09c05a74..8da82822 100644 --- a/pydis_site/apps/api/viewsets/bot/infraction.py +++ b/pydis_site/apps/api/viewsets/bot/infraction.py @@ -230,7 +230,11 @@ class InfractionViewSet( }) additional_filters['type__in'] = [i.strip() for i in filter_types.split(",")] - return self.queryset.filter(**additional_filters) + qs = self.queryset.filter(**additional_filters) + if self.serializer_class is ExpandedInfractionSerializer: + return qs.prefetch_related('actor', 'user') + + return qs @action(url_path='expanded', detail=False) def list_expanded(self, *args, **kwargs) -> Response: -- cgit v1.2.3