Commit 7b7ca892 by Renzo Lucioni

Reduce course run view's query count

Prefetching of course run video image, course level type, and program excluded runs further reduces the number of queries required to service requests for course runs.
parent bb728abf
...@@ -429,7 +429,9 @@ class CourseRunSerializer(MinimalCourseRunSerializer): ...@@ -429,7 +429,9 @@ class CourseRunSerializer(MinimalCourseRunSerializer):
queryset = super().prefetch_queryset(queryset=queryset) queryset = super().prefetch_queryset(queryset=queryset)
return queryset.select_related('language', 'video').prefetch_related( return queryset.select_related('language', 'video').prefetch_related(
'course__level_type',
'transcript_languages', 'transcript_languages',
'video__image',
Prefetch('staff', queryset=PersonSerializer.prefetch_queryset()), Prefetch('staff', queryset=PersonSerializer.prefetch_queryset()),
) )
...@@ -453,7 +455,7 @@ class CourseRunWithProgramsSerializer(CourseRunSerializer): ...@@ -453,7 +455,7 @@ class CourseRunWithProgramsSerializer(CourseRunSerializer):
def prefetch_queryset(cls, queryset=None): def prefetch_queryset(cls, queryset=None):
queryset = super().prefetch_queryset(queryset=queryset) queryset = super().prefetch_queryset(queryset=queryset)
return queryset.prefetch_related('course__programs') return queryset.prefetch_related('course__programs__excluded_course_runs')
def get_programs(self, obj): def get_programs(self, obj):
programs = [] programs = []
......
...@@ -172,7 +172,7 @@ class CatalogViewSetTests(ElasticsearchTestMixin, SerializationMixin, OAuth2Mixi ...@@ -172,7 +172,7 @@ class CatalogViewSetTests(ElasticsearchTestMixin, SerializationMixin, OAuth2Mixi
# to be included. # to be included.
filtered_course_run = CourseRunFactory(course=course) filtered_course_run = CourseRunFactory(course=course)
with self.assertNumQueries(18): with self.assertNumQueries(19):
response = self.client.get(url) response = self.client.get(url)
assert response.status_code == 200 assert response.status_code == 200
......
...@@ -51,7 +51,7 @@ class CourseRunViewSetTests(SerializationMixin, ElasticsearchTestMixin, APITestC ...@@ -51,7 +51,7 @@ class CourseRunViewSetTests(SerializationMixin, ElasticsearchTestMixin, APITestC
url = reverse('api:v1:course_run-detail', kwargs={'key': self.course_run.key}) url = reverse('api:v1:course_run-detail', kwargs={'key': self.course_run.key})
with self.assertNumQueries(10): with self.assertNumQueries(11):
response = self.client.get(url) response = self.client.get(url)
assert response.status_code == 200 assert response.status_code == 200
assert response.data.get('programs') == [] assert response.data.get('programs') == []
...@@ -133,7 +133,7 @@ class CourseRunViewSetTests(SerializationMixin, ElasticsearchTestMixin, APITestC ...@@ -133,7 +133,7 @@ class CourseRunViewSetTests(SerializationMixin, ElasticsearchTestMixin, APITestC
""" Verify the endpoint returns a list of all course runs. """ """ Verify the endpoint returns a list of all course runs. """
url = reverse('api:v1:course_run-list') url = reverse('api:v1:course_run-list')
with self.assertNumQueries(13): with self.assertNumQueries(11):
response = self.client.get(url) response = self.client.get(url)
assert response.status_code == 200 assert response.status_code == 200
...@@ -146,7 +146,7 @@ class CourseRunViewSetTests(SerializationMixin, ElasticsearchTestMixin, APITestC ...@@ -146,7 +146,7 @@ class CourseRunViewSetTests(SerializationMixin, ElasticsearchTestMixin, APITestC
""" Verify the endpoint returns a list of all course runs sorted by start date. """ """ Verify the endpoint returns a list of all course runs sorted by start date. """
url = '{root}?ordering=start'.format(root=reverse('api:v1:course_run-list')) url = '{root}?ordering=start'.format(root=reverse('api:v1:course_run-list'))
with self.assertNumQueries(13): with self.assertNumQueries(11):
response = self.client.get(url) response = self.client.get(url)
assert response.status_code == 200 assert response.status_code == 200
......
...@@ -64,7 +64,7 @@ class ProgramViewSetTests(SerializationMixin, APITestCase): ...@@ -64,7 +64,7 @@ class ProgramViewSetTests(SerializationMixin, APITestCase):
def test_retrieve(self): def test_retrieve(self):
""" Verify the endpoint returns the details for a single program. """ """ Verify the endpoint returns the details for a single program. """
program = self.create_program() program = self.create_program()
with self.assertNumQueries(39): with self.assertNumQueries(41):
response = self.assert_retrieve_success(program) response = self.assert_retrieve_success(program)
assert response.data == self.serialize_program(program) assert response.data == self.serialize_program(program)
...@@ -75,7 +75,7 @@ class ProgramViewSetTests(SerializationMixin, APITestCase): ...@@ -75,7 +75,7 @@ class ProgramViewSetTests(SerializationMixin, APITestCase):
for course in course_list: for course in course_list:
CourseRunFactory(course=course) CourseRunFactory(course=course)
program = ProgramFactory(courses=course_list, order_courses_by_start_date=order_courses_by_start_date) program = ProgramFactory(courses=course_list, order_courses_by_start_date=order_courses_by_start_date)
with self.assertNumQueries(26): with self.assertNumQueries(28):
response = self.assert_retrieve_success(program) response = self.assert_retrieve_success(program)
assert response.data == self.serialize_program(program) assert response.data == self.serialize_program(program)
self.assertEqual(course_list, list(program.courses.all())) # pylint: disable=no-member self.assertEqual(course_list, list(program.courses.all())) # pylint: disable=no-member
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment