From 83b588c53cd7904a3f69d09898c47aaea4976d67 Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Tue, 2 Nov 2021 12:45:14 +0100
Subject: [PATCH] TMSS-1124: fetch the subtask's input/output dataproducts and
 all related properties in one queryset. Major speedup

---
 SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py
index eb80e6ab170..7af1c78862e 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py
@@ -311,7 +311,9 @@ class SubtaskViewSet(LOFARViewSet):
     @action(methods=['get'], detail=True, url_name='input_dataproducts')
     def input_dataproducts(self, request, pk=None):
         subtask = get_object_or_404(models.Subtask, pk=pk)
-        serializer = serializers.DataproductSerializer(subtask.input_dataproducts, many=True, context={'request': request})
+        # fetch the subtask's input_dataproducts and all related properties in one queryset. Major speedup.
+        input_dataproducts = subtask.input_dataproducts.select_related('dataformat', 'datatype', 'specifications_template', 'producer', 'feedback_template', 'sap', 'global_identifier', 'archive_info').prefetch_related('consumers')
+        serializer = serializers.DataproductSerializer(input_dataproducts, many=True, context={'request': request})
         return RestResponse(serializer.data)
 
 
@@ -321,7 +323,9 @@ class SubtaskViewSet(LOFARViewSet):
     @action(methods=['get'], detail=True, url_name='output_dataproducts')
     def output_dataproducts(self, request, pk=None):
         subtask = get_object_or_404(models.Subtask, pk=pk)
-        serializer = serializers.DataproductSerializer(subtask.output_dataproducts, many=True, context={'request': request})
+        # fetch the subtask's output_dataproducts and all related properties in one queryset. Major speedup.
+        output_dataproducts = subtask.output_dataproducts.select_related('dataformat', 'datatype', 'specifications_template', 'producer', 'feedback_template', 'sap', 'global_identifier', 'archive_info').prefetch_related('consumers')
+        serializer = serializers.DataproductSerializer(output_dataproducts, many=True, context={'request': request})
         return RestResponse(serializer.data)
 
 
-- 
GitLab