Skip to content
Snippets Groups Projects
Verified Commit e5ef3a61 authored by Jan Maximilian Michal's avatar Jan Maximilian Michal
Browse files

Use prefetching on certain queries in order to boost response time

* This means a 2x - 10x performace boost especially for the student
  and the feedback endpoint
parent c98a1e35
No related branches found
No related tags found
1 merge request!68Use prefetching on certain queries in order to boost response time
Pipeline #
......@@ -47,10 +47,7 @@ class SubscriptionSerializer(DynamicFieldsModelSerializer):
available = serializers.SerializerMethodField()
def get_assignments(self, subscription):
queryset = TutorSubmissionAssignment.objects.filter(
subscription=subscription,
is_done=False
)
queryset = subscription.assignments.filter(is_done=False)
serializer = AssignmentDetailSerializer(queryset, many=True)
return serializer.data
......
......@@ -54,7 +54,13 @@ class StudentSelfSubmissionsApiView(generics.ListAPIView):
class StudentReviewerApiViewSet(viewsets.ReadOnlyModelViewSet):
""" Gets a list of all students without individual submissions """
permission_classes = (IsReviewer,)
queryset = StudentInfo.objects.all()
queryset = StudentInfo.objects\
.select_related('user')\
.select_related('exam')\
.prefetch_related('submissions')\
.prefetch_related('submissions__feedback')\
.prefetch_related('submissions__type')\
.all()
serializer_class = StudentInfoSerializerForListView
......
......@@ -16,7 +16,10 @@ class FeedbackApiView(
viewsets.GenericViewSet):
""" Gets a list of an individual exam by Id if provided """
permission_classes = (permissions.IsTutorOrReviewer,)
queryset = models.Feedback.objects.all()
queryset = models.Feedback.objects\
.select_related('of_submission')\
.select_related('of_submission__type')\
.all()
serializer_class = serializers.FeedbackSerializer
lookup_field = 'of_submission__pk'
lookup_url_kwarg = 'submission_pk'
......@@ -69,10 +72,10 @@ class FeedbackApiView(
def get_queryset(self):
if self.request.user.is_reviewer():
return models.Feedback.objects.all()
return self.queryset.all()
else:
# only return feedback that the requesting user has worked on
return models.Feedback.objects.filter(
return self.queryset.filter(
of_submission__assignments__subscription__owner=self.request.user # noqa
)
......
......@@ -20,9 +20,12 @@ class SubscriptionApiViewSet(
viewsets.GenericViewSet):
permission_classes = (permissions.IsTutorOrReviewer,)
serializer_class = serializers.SubscriptionSerializer
queryset = models.SubmissionSubscription.objects\
.prefetch_related('assignments')\
.select_related('owner')
def get_queryset(self):
return models.SubmissionSubscription.objects.filter(
return self.queryset.filter(
owner=self.request.user,
deactivated=False
)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment