Update queryset annotation for StockItem

- Query time reduced from 4.1 to 3.5s (for sample data)
This commit is contained in:
Oliver Walters 2020-09-05 22:50:17 +10:00
parent 42967905bc
commit db214dfd73

View File

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