summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Axtens <dja@axtens.net>2020-04-14 14:26:58 +1000
committerDaniel Axtens <dja@axtens.net>2020-04-14 23:27:17 +1000
commit08c5856444bc2e100c4acbbea0a244cd46083c4b (patch)
tree5278109acb8e6e7b77e986feffd6bf52569d2437
parent4eaf300678df4d28b2cee4ad2f2de547daef5169 (diff)
downloadpatchwork-08c5856444bc2e100c4acbbea0a244cd46083c4b.tar
patchwork-08c5856444bc2e100c4acbbea0a244cd46083c4b.tar.gz
api: do not fetch every patch in a patch detail view 404
mpe and jk and sfr found that the OzLabs server was melting due to some queries downloading every patch. Turns out if you 404 the patch detail view in the API, d-r-f attempts to render a listbox with every single patch to fill in the 'related' field. The bundle API also has a similar field. Replace the multiple selection box with a text field. You can still (AIUI) populate the relevant patch IDs manually. This is the recommended approach per https://www.django-rest-framework.org/topics/browsable-api/#handling-choicefield-with-large-numbers-of-items Reported-by: Jeremy Kerr <jk@ozlabs.org> Reported-by: Michael Ellerman <mpe@ellerman.id.au> Reported-by: Stephen Rothwell <sfr@canb.auug.org.au> Tested-by: Jeremy Kerr <jk@ozlabs.org> Server-no-longer-on-fire-by: Jeremy Kerr <jk@ozlabs.org> Reviewed-by: Stephen Finucane <stephen@that.guru> Signed-off-by: Daniel Axtens <dja@axtens.net>
-rw-r--r--patchwork/api/bundle.py3
-rw-r--r--patchwork/api/embedded.py3
2 files changed, 4 insertions, 2 deletions
diff --git a/patchwork/api/bundle.py b/patchwork/api/bundle.py
index b8c0f17..54a9266 100644
--- a/patchwork/api/bundle.py
+++ b/patchwork/api/bundle.py
@@ -62,7 +62,8 @@ class BundleSerializer(BaseHyperlinkedModelSerializer):
project = ProjectSerializer(read_only=True)
mbox = SerializerMethodField()
owner = UserSerializer(read_only=True)
- patches = PatchSerializer(many=True, required=True)
+ patches = PatchSerializer(many=True, required=True,
+ style={'base_template': 'input.html'})
def get_web_url(self, instance):
request = self.context.get('request')
diff --git a/patchwork/api/embedded.py b/patchwork/api/embedded.py
index 85a30ca..cb3f07e 100644
--- a/patchwork/api/embedded.py
+++ b/patchwork/api/embedded.py
@@ -141,7 +141,8 @@ class PatchSerializer(SerializedRelatedField):
class PatchRelationSerializer(BaseHyperlinkedModelSerializer):
"""Hide the PatchRelation model, just show the list"""
- patches = PatchSerializer(many=True)
+ patches = PatchSerializer(many=True,
+ style={'base_template': 'input.html'})
def to_internal_value(self, data):
if not isinstance(data, type([])):