diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index f50b8572c9..4a9b5a886b 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -9,9 +9,12 @@ from .models import StockItemTracking from .models import StockItemAttachment from .models import StockItemTestResult -from django.db.models import Sum, Count from django.db.models.functions import Coalesce +from sql_util.utils import SubquerySum, SubqueryCount + +from decimal import Decimal + from company.serializers import SupplierPartSerializer from part.serializers import PartBriefSerializer from InvenTree.serializers import UserSerializerBrief, InvenTreeModelSerializer @@ -90,11 +93,18 @@ class StockItemSerializer(InvenTreeModelSerializer): performing database queries as efficiently as possible. """ + # Annotate the queryset with the total allocated to sales orders queryset = queryset.annotate( allocated=Coalesce( - Sum('sales_order_allocations__quantity', distinct=True), 0) + Coalesce( - Sum('allocations__quantity', distinct=True), 0), - tracking_items=Count('tracking_info'), + SubquerySum('sales_order_allocations__quantity'), Decimal(0) + ) + Coalesce( + SubquerySum('allocations__quantity'), Decimal(0) + ) + ) + + # Annotate the queryset with the number of tracking items + queryset = queryset.annotate( + tracking_items=SubqueryCount('tracking_info') ) return queryset