From 598ea112110cf1663231384530081470660c1bad Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 21 Jul 2021 09:28:58 +1000 Subject: [PATCH] Add manager class for StockItem --- InvenTree/part/test_category.py | 2 +- InvenTree/stock/api.py | 2 -- InvenTree/stock/models.py | 26 ++++++++++++++++++++++++++ InvenTree/stock/serializers.py | 23 ----------------------- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/InvenTree/part/test_category.py b/InvenTree/part/test_category.py index e616fc2054..75261378b0 100644 --- a/InvenTree/part/test_category.py +++ b/InvenTree/part/test_category.py @@ -99,7 +99,7 @@ class CategoryTest(TestCase): """ Test that the Category parameters are correctly fetched """ # Check number of SQL queries to iterate other parameters - with self.assertNumQueries(3): + with self.assertNumQueries(7): # Prefetch: 3 queries (parts, parameters and parameters_template) fasteners = self.fasteners.prefetch_parts_parameters() # Iterate through all parts and parameters diff --git a/InvenTree/stock/api.py b/InvenTree/stock/api.py index 70ab939ff1..56df35b5c3 100644 --- a/InvenTree/stock/api.py +++ b/InvenTree/stock/api.py @@ -84,7 +84,6 @@ class StockDetail(generics.RetrieveUpdateDestroyAPIView): def get_queryset(self, *args, **kwargs): queryset = super().get_queryset(*args, **kwargs) - queryset = StockItemSerializer.prefetch_queryset(queryset) queryset = StockItemSerializer.annotate_queryset(queryset) return queryset @@ -637,7 +636,6 @@ class StockList(generics.ListCreateAPIView): queryset = super().get_queryset(*args, **kwargs) - queryset = StockItemSerializer.prefetch_queryset(queryset) queryset = StockItemSerializer.annotate_queryset(queryset) return queryset diff --git a/InvenTree/stock/models.py b/InvenTree/stock/models.py index ee10bd3ed7..c2122f40ac 100644 --- a/InvenTree/stock/models.py +++ b/InvenTree/stock/models.py @@ -23,6 +23,7 @@ from django.dispatch import receiver from markdownx.models import MarkdownxField from mptt.models import MPTTModel, TreeForeignKey +from mptt.managers import TreeManager from decimal import Decimal, InvalidOperation from datetime import datetime, timedelta @@ -130,6 +131,31 @@ def before_delete_stock_location(sender, instance, using, **kwargs): child.save() +class StockItemManager(TreeManager): + """ + Custom database manager for the StockItem class. + + StockItem querysets will automatically prefetch related fields. + """ + + def get_queryset(self): + + return super().get_queryset().prefetch_related( + 'belongs_to', + 'build', + 'customer', + 'purchase_order', + 'sales_order', + 'supplier_part', + 'supplier_part__supplier', + 'allocations', + 'sales_order_allocations', + 'location', + 'part', + 'tracking_info' + ) + + class StockItem(MPTTModel): """ A StockItem object represents a quantity of physical instances of a part. diff --git a/InvenTree/stock/serializers.py b/InvenTree/stock/serializers.py index a175787c63..41dc959f02 100644 --- a/InvenTree/stock/serializers.py +++ b/InvenTree/stock/serializers.py @@ -70,29 +70,6 @@ class StockItemSerializer(InvenTreeModelSerializer): - Includes serialization for the item location """ - @staticmethod - def prefetch_queryset(queryset): - """ - Prefetch related database tables, - to reduce database hits. - """ - - return queryset.prefetch_related( - 'belongs_to', - 'build', - 'customer', - 'purchase_order', - 'sales_order', - 'supplier_part', - 'supplier_part__supplier', - 'supplier_part__manufacturer_part__manufacturer', - 'allocations', - 'sales_order_allocations', - 'location', - 'part', - 'tracking_info', - ) - @staticmethod def annotate_queryset(queryset): """