From 2fb450007e26d9c5a6a4a1fad4bbe7e907ef4c09 Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Wed, 9 Sep 2026 10:07:07 +0330 Subject: [PATCH] perf(hadis-sync): optimize prefetching for corrections and interpretations to eliminate N+1 queries --- apps/hadis/views/hadis.py | 42 +++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/apps/hadis/views/hadis.py b/apps/hadis/views/hadis.py index 5cc067b..fbb8a5f 100644 --- a/apps/hadis/views/hadis.py +++ b/apps/hadis/views/hadis.py @@ -10,7 +10,7 @@ from rest_framework.response import Response from django.db.models import Count from django.db.models import Prefetch from ..serializers.category import get_localized_text -from ..models import Transmitters, HadisCategory, Hadis, HadisCollection,HadisTransmitter , HadisCorrection ,HadisReference, HadisStatus ,ReferenceImage +from ..models import Transmitters, HadisCategory, Hadis, HadisCollection,HadisTransmitter , HadisCorrection ,HadisReference, HadisStatus ,ReferenceImage, CorrectionReference, HadisInterpretation, InterpretationReference from ..serializers import HadisListSerializer, HadisBasicSerializer, HadisDetailSerializer, HadisCollectionListSerializer, HadisSyncSerializer,HadisCorrectionSerializer,HadisTransmitterListSerializer , SimpleCategory, NarratorLayerSerializer , PinnedHadisCollectionSerializer, HadisSourceDetailsSerializer from ..docs import arguments_filters_swagger ,hadis_list_swagger, hadis_detail_swagger, hadis_collections_swagger, hadis_sync_swagger, hadis_transmitters_swagger, hadis_corrections_swagger, hadis_basic_swagger, hadis_main_list_swagger, hadis_layers_swagger from django.db.models import Q @@ -143,24 +143,44 @@ class HadisSyncView(ListAPIView): ) ) ), - # 👇 اضافه شدن واکشی عمیق برای تصحیحات + # 👇 اضافه شدن واکشی عمیق برای تصحیحات (بدون N+1) Prefetch( 'hadiscorrection_set', queryset=HadisCorrection.objects.select_related('hadis').prefetch_related( - 'references__book_reference__author', - 'references__edition', - 'references__book_volume', - 'references__images' + Prefetch( + 'references', + queryset=CorrectionReference.objects.select_related( + 'book_reference', + 'book_reference__author', + 'edition', + 'book_volume', + 'book_volume__edition' + ).prefetch_related( + 'images', + 'book_reference__editions', + 'book_reference__volumes' + ) + ) ) ), - # 👇 اضافه شدن واکشی عمیق برای تفاسیر + # 👇 اضافه شدن واکشی عمیق برای تفاسیر (بدون N+1) Prefetch( 'category__interpretations', queryset=HadisInterpretation.objects.select_related('category').prefetch_related( - 'references__book_reference__author', - 'references__edition', - 'references__book_volume', - 'references__images' + Prefetch( + 'references', + queryset=InterpretationReference.objects.select_related( + 'book_reference', + 'book_reference__author', + 'edition', + 'book_volume', + 'book_volume__edition' + ).prefetch_related( + 'images', + 'book_reference__editions', + 'book_reference__volumes' + ) + ) ) ), )