]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
REST: Correct some prefetch, select_related
authorStephen Finucane <stephen@that.guru>
Mon, 15 May 2017 23:13:27 +0000 (00:13 +0100)
committerStephen Finucane <stephen@that.guru>
Thu, 18 May 2017 20:18:37 +0000 (21:18 +0100)
There were two issues here:

- The 'get_queryset' function, rather than the 'queryset' attribute,
  must be overriden when using either the 'prefetch_related' or
  'select_related' functions

- A couple of endpoints contained a 'project' attribute, but this wasn't
  being prefetched. This didn't cause issues in a single-project
  deployment, as used in testing, but will for larger deployments

Resolve both issues.

Signed-off-by: Stephen Finucane <stephen@that.guru>
patchwork/api/cover.py
patchwork/api/patch.py
patchwork/api/person.py
patchwork/api/project.py

index 8b8d47b1a69d28284f9e40a30a5a023ac9bc0c72..e45680bc0861f15fa6382812a917c8968b3fd8e7 100644 (file)
@@ -73,7 +73,7 @@ class CoverLetterList(ListAPIView):
 
     def get_queryset(self):
         qs = CoverLetter.objects.all().prefetch_related('series')\
-            .select_related('submitter')
+            .select_related('project', 'submitter')
 
         # FIXME(stephenfin): This causes issues with Django 1.6 for whatever
         # reason. Suffer the performance hit on those versions.
@@ -90,4 +90,4 @@ class CoverLetterDetail(RetrieveAPIView):
 
     def get_queryset(self):
         return CoverLetter.objects.all().prefetch_related('series')\
-            .select_related('submitter')
+            .select_related('project', 'submitter')
index 1e5c13fa36187c72a6f4a16f559c9619ca611dc1..294c5f625b7aab3c5f623a80e99193e9cfad12f0 100644 (file)
@@ -147,9 +147,11 @@ class PatchList(ListAPIView):
                        'submitter', 'check')
 
     def get_queryset(self):
+        # TODO(stephenfin): Does the defer here cause issues with Django 1.6
+        # (like /cover)?
         return Patch.objects.all().with_tag_counts()\
             .prefetch_related('series', 'check_set')\
-            .select_related('state', 'submitter', 'delegate')\
+            .select_related('project', 'state', 'submitter', 'delegate')\
             .defer('content', 'diff', 'headers')
 
 
@@ -162,4 +164,4 @@ class PatchDetail(RetrieveUpdateAPIView):
     def get_queryset(self):
         return Patch.objects.all().with_tag_counts()\
             .prefetch_related('series', 'check_set')\
-            .select_related('state', 'submitter', 'delegate')
+            .select_related('project', 'state', 'submitter', 'delegate')
index 7947f8259e90bb24ae362ba30c191c7b38aaf106..574fa842e1f49cb29e787f1482a9a6a5ecd834e7 100644 (file)
@@ -38,10 +38,12 @@ class PersonSerializer(HyperlinkedModelSerializer):
 
 class PersonMixin(object):
 
-    queryset = Person.objects.prefetch_related('user')
     permission_classes = (IsAuthenticated,)
     serializer_class = PersonSerializer
 
+    def get_queryset(self):
+        return Person.objects.all().prefetch_related('user')
+
 
 class PersonList(PersonMixin, ListAPIView):
     """List users."""
index ce3ed58191e3c4f3d9db37a96c7ba5c5d5d73418..8fb8984a29f60937ee79b555fe8a51aac3e94a73 100644 (file)
@@ -48,7 +48,6 @@ class ProjectSerializer(HyperlinkedModelSerializer):
 
 class ProjectMixin(object):
 
-    queryset = Project.objects.all()
     permission_classes = (PatchworkPermission,)
     serializer_class = ProjectSerializer
 
@@ -70,6 +69,9 @@ class ProjectMixin(object):
 
         return obj
 
+    def get_queryset(self):
+        return Project.objects.all().prefetch_related('maintainer_project')
+
 
 class ProjectList(ProjectMixin, ListAPIView):
     """List projects."""