Skip to content

Commit 83215a4

Browse files
committed
Refactored AutoPrefetchRelated mixin
1 parent 4e30c1b commit 83215a4

File tree

2 files changed

+13
-10
lines changed

2 files changed

+13
-10
lines changed

example/tests/test_performance.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ def test_query_count_include_author(self):
5353
4. Author types prefetched
5454
5. Entries prefetched
5555
"""
56-
with self.assertNumQueries(5):
56+
with self.assertNumQueries(4):
5757
response = self.client.get('/comments?include=author&page[size]=25')
5858
self.assertEqual(len(response.data['results']), 25)
5959

rest_framework_json_api/views.py

+12-9
Original file line numberDiff line numberDiff line change
@@ -98,22 +98,25 @@ def get_select_related(self, include):
9898
def get_prefetch_related(self, include):
9999
return getattr(self, 'prefetch_for_includes', {}).get(include, None)
100100

101+
def get_queryset_with_related(self, qs, included):
102+
select_related = self.get_select_related(included)
103+
if select_related is not None:
104+
qs = qs.select_related(*select_related)
105+
106+
prefetch_related = self.get_prefetch_related(included)
107+
if prefetch_related is not None:
108+
qs = qs.prefetch_related(*prefetch_related)
109+
110+
return qs
111+
101112
def get_queryset(self, *args, **kwargs):
102113
""" This mixin adds automatic prefetching for OneToOne and ManyToMany fields. """
103114
qs = super(AutoPreloadMixin, self).get_queryset(*args, **kwargs)
104115
included_resources = get_included_resources(self.request)
105116

106117
for included in included_resources + ['__all__']:
107118
# Custom defined "select_related" and "prefetch_related" is a priority
108-
select_related = self.get_select_related(included)
109-
if select_related is not None:
110-
qs = qs.select_related(*select_related)
111-
continue
112-
113-
prefetch_related = self.get_prefetch_related(included)
114-
if prefetch_related is not None:
115-
qs = qs.prefetch_related(*prefetch_related)
116-
continue
119+
qs = self.get_queryset_with_related(qs, included)
117120

118121
# If include was not defined, trying to resolve it automatically
119122
included_model = None

0 commit comments

Comments
 (0)