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):
         """