Optimize collection_viva by aggressively prefetching and annotating related objects to prevent N+1 queries

This commit is contained in:
Ross
2026-02-09 12:15:36 +00:00
parent ab130a08ed
commit 23f33ac7ae
2 changed files with 32 additions and 22 deletions
+14 -5
View File
@@ -720,11 +720,20 @@ class Case(models.Model, AuthorMixin, QuestionMixin):
series_qs = self.series.all()
if exclude_series_ids is not None:
series_qs = self.series.exclude(id__in=exclude_series_ids)
images = [
[image.image.url for image in series.images.filter(removed=False)]
for series in series_qs.order_by('seriesdetail__sort_order').prefetch_related('images')
]
series_qs = series_qs.exclude(id__in=exclude_series_ids)
# Ensure series are ordered by the through model sort_order
series_list = list(series_qs.order_by('seriesdetail__sort_order').prefetch_related('images'))
images = []
for series in series_list:
# If images were prefetched, use the cached list and filter in Python
prefetched = getattr(series, '_prefetched_objects_cache', {}).get('images')
if prefetched is not None:
imgs = [img.image.url for img in prefetched if not getattr(img, 'removed', False)]
else:
imgs = [image.image.url for image in series.images.filter(removed=False)]
images.append(imgs)
if as_json:
return json.dumps(images)