From f40bcd03401084a9687a9b1f7a0c210eb2e7e42e Mon Sep 17 00:00:00 2001 From: Mete Polat Date: Wed, 29 Jan 2020 20:01:22 +0100 Subject: [PATCH] REST: Fix duplicate project queries Eliminates duplicate project queries caused by calling get_absolute_url() in the embedded serializers. Following foreign keys with 'series__project' will cache the project of the series as well as the series itself. Signed-off-by: Mete Polat Signed-off-by: Stephen Finucane Closes: #335 (backported from commit ec00daae4d79bf2560034e1b2bc3cf76a98a3212 dropped all the tests, they clash horribly) Signed-off-by: Daniel Axtens --- patchwork/api/cover.py | 3 ++- patchwork/api/event.py | 4 ++-- patchwork/api/patch.py | 5 +++-- patchwork/api/series.py | 5 +++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/patchwork/api/cover.py b/patchwork/api/cover.py index b497fd85..8a9e61e2 100644 --- a/patchwork/api/cover.py +++ b/patchwork/api/cover.py @@ -103,7 +103,8 @@ class CoverLetterList(ListAPIView): ordering = 'id' def get_queryset(self): - return CoverLetter.objects.all().prefetch_related('series')\ + return CoverLetter.objects.all().prefetch_related('series', + 'series__project')\ .select_related('project', 'submitter')\ .defer('content', 'headers') diff --git a/patchwork/api/event.py b/patchwork/api/event.py index cce25a75..e354ae2c 100644 --- a/patchwork/api/event.py +++ b/patchwork/api/event.py @@ -96,7 +96,7 @@ class EventList(ListAPIView): def get_queryset(self): return Event.objects.all()\ - .prefetch_related('project', 'patch', 'series', 'cover', - 'previous_state', 'current_state', + .prefetch_related('project', 'patch__project', 'series__project', + 'cover', 'previous_state', 'current_state', 'previous_delegate', 'current_delegate', 'created_check') diff --git a/patchwork/api/patch.py b/patchwork/api/patch.py index f772c654..c55bf9c9 100644 --- a/patchwork/api/patch.py +++ b/patchwork/api/patch.py @@ -187,8 +187,9 @@ class PatchList(ListAPIView): def get_queryset(self): return Patch.objects.all()\ - .prefetch_related('series', 'check_set')\ - .select_related('project', 'state', 'submitter', 'delegate')\ + .prefetch_related('series', 'check_set', 'series__project')\ + .select_related('project', 'state', 'submitter', 'delegate', + )\ .defer('content', 'diff', 'headers') diff --git a/patchwork/api/series.py b/patchwork/api/series.py index 14768efb..627b8743 100644 --- a/patchwork/api/series.py +++ b/patchwork/api/series.py @@ -69,8 +69,9 @@ class SeriesMixin(object): serializer_class = SeriesSerializer def get_queryset(self): - return Series.objects.all().prefetch_related('patches',)\ - .select_related('submitter', 'cover_letter', 'project') + return Series.objects.all()\ + .prefetch_related('patches__project',)\ + .select_related('submitter', 'cover_letter__project', 'project') class SeriesList(SeriesMixin, ListAPIView): -- 2.47.3