Optimize product count retrieval and enhance query performance with prefetch_related

This commit is contained in:
Parsa Nazer
2025-11-03 11:56:47 +03:30
parent d760a50da5
commit bf0817ed34
2 changed files with 15 additions and 3 deletions
+3 -1
View File
@@ -102,7 +102,9 @@ class SubCategorySerializer(serializers.ModelSerializer):
'meta_description', 'product_count', 'parent', 'image']
def get_product_count(self, obj):
return obj.products.count()
# Use annotated product_count if available (from optimized query)
# Otherwise fall back to counting (for backward compatibility)
return getattr(obj, 'product_count', obj.products.count())
def get_parent(self, obj):
return obj.parent.name
+12 -2
View File
@@ -14,7 +14,7 @@ from drf_spectacular.utils import extend_schema, OpenApiParameter, OpenApiTypes
from rest_framework.permissions import AllowAny
from order.serializers import OrderItemSerailzier
from order.models import OrderModel
from django.db.models import Min, Max
from django.db.models import Min, Max, Count, Prefetch
from home.models import ShowCaseSlider
from home.serializers import ShowCaseSliderSerialzier
from order.models import Cart, CartItem
@@ -51,7 +51,17 @@ class AllCategories(APIView):
# if search_query:
# categories = MainCategoryModel.objects.filter(Q(name__icontains=search_query) | Q(slug__icontains=search_query))
# else:
categories = MainCategoryModel.objects.all()
# Optimize query with prefetch_related to avoid N+1 queries
categories = MainCategoryModel.objects.prefetch_related(
Prefetch(
'subcategorys',
queryset=SubCategoryModel.objects.annotate(
product_count=Count('products')
)
)
).all()
categories_ser = self.serializer_class(
instance=categories, many=True, context={'request': request})
return Response(categories_ser.data, status=status.HTTP_200_OK)