From af5ddba0e0858816994aecae3f2e4db31674cc01 Mon Sep 17 00:00:00 2001 From: Paulo Viadanna Date: Thu, 19 Feb 2026 17:08:06 -0300 Subject: [PATCH 1/3] fix: prefetch video_image when getting a video --- edxval/api.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/edxval/api.py b/edxval/api.py index 9406abdc..f20a986c 100644 --- a/edxval/api.py +++ b/edxval/api.py @@ -540,9 +540,10 @@ def _get_video(edx_video_id): """ try: encoded_videos = EncodedVideo.objects.select_related("profile") + course_videos = CourseVideo.objects.select_related("video_image") return Video.objects \ .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ - .prefetch_related("courses") \ + .prefetch_related(Prefetch("courses", queryset=course_videos)) \ .get(edx_video_id=edx_video_id) except Video.DoesNotExist as no_video_error: error_message = f"Video not found for edx_video_id: {edx_video_id}" From 0940e7a1790ba6214f0f6d4ce5608cb43f06698c Mon Sep 17 00:00:00 2001 From: Paulo Viadanna Date: Wed, 20 May 2026 11:37:36 -0300 Subject: [PATCH 2/3] fix: prefetch encoded_videos when getting a video --- edxval/api.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/edxval/api.py b/edxval/api.py index f20a986c..e5901642 100644 --- a/edxval/api.py +++ b/edxval/api.py @@ -650,7 +650,12 @@ def _get_videos_for_filter(video_filter, sort_field=None, sort_dir=SortDirection the given field and direction, with ties broken by edx_video_id to ensure a total order. """ - videos = Video.objects.filter(**video_filter) + video_image = CourseVideo.objects.select_related("video_image") + encoded_videos = EncodedVideo.objects.select_related("profile") + videos = Video.objects \ + .prefetch_related(Prefetch("courses", queryset=video_image)) \ + .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ + .filter(**video_filter) paginator_context = {} if sort_field: From 9db63f41d54d60d2e89e2263ecb0fef5f52b606f Mon Sep 17 00:00:00 2001 From: Paulo Viadanna Date: Mon, 25 May 2026 09:21:53 -0300 Subject: [PATCH 3/3] refactor: extract video queryset with prefetch --- edxval/api.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/edxval/api.py b/edxval/api.py index e5901642..5753c5d4 100644 --- a/edxval/api.py +++ b/edxval/api.py @@ -532,6 +532,20 @@ def create_profile(profile_name): raise ValCannotCreateError(err.message_dict) from err +def _get_video_qset(prefetch_related=False): + """ + Get a Video queryset, optionally prefetching encoded video and course information. + """ + video_qset = Video.objects + if prefetch_related: + encoded_videos = EncodedVideo.objects.select_related("profile") + course_videos = CourseVideo.objects.select_related("video_image") + video_qset = video_qset \ + .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ + .prefetch_related(Prefetch("courses", queryset=course_videos)) + return video_qset + + def _get_video(edx_video_id): """ Get a Video instance, prefetching encoded video and course information. @@ -539,12 +553,7 @@ def _get_video(edx_video_id): Raises ValVideoNotFoundError if the video cannot be retrieved. """ try: - encoded_videos = EncodedVideo.objects.select_related("profile") - course_videos = CourseVideo.objects.select_related("video_image") - return Video.objects \ - .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ - .prefetch_related(Prefetch("courses", queryset=course_videos)) \ - .get(edx_video_id=edx_video_id) + return _get_video_qset(prefetch_related=True).get(edx_video_id=edx_video_id) except Video.DoesNotExist as no_video_error: error_message = f"Video not found for edx_video_id: {edx_video_id}" raise ValVideoNotFoundError(error_message) from no_video_error @@ -650,12 +659,7 @@ def _get_videos_for_filter(video_filter, sort_field=None, sort_dir=SortDirection the given field and direction, with ties broken by edx_video_id to ensure a total order. """ - video_image = CourseVideo.objects.select_related("video_image") - encoded_videos = EncodedVideo.objects.select_related("profile") - videos = Video.objects \ - .prefetch_related(Prefetch("courses", queryset=video_image)) \ - .prefetch_related(Prefetch("encoded_videos", queryset=encoded_videos)) \ - .filter(**video_filter) + videos = _get_video_qset(prefetch_related=True).filter(**video_filter) paginator_context = {} if sort_field: