Skip to content

Commit bfbb1a6

Browse files
committed
Optimize queries
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent 88a6d90 commit bfbb1a6

File tree

2 files changed

+38
-7
lines changed

2 files changed

+38
-7
lines changed

vulnerabilities/api_v3.py

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
from urllib.parse import urlencode
1111

12+
from django.db.models import Prefetch
1213
from django_filters import rest_framework as filters
1314
from packageurl import PackageURL
1415
from rest_framework import serializers
@@ -90,21 +91,24 @@ class Meta:
9091

9192

9293
class AdvisoryV3Serializer(serializers.ModelSerializer):
93-
aliases = serializers.SerializerMethodField()
94+
aliases = serializers.SlugRelatedField(
95+
many=True,
96+
read_only=True,
97+
slug_field="alias",
98+
)
9499
weaknesses = AdvisoryWeaknessSerializer(many=True)
95100
references = AdvisoryReferenceSerializer(many=True)
96101
severities = AdvisorySeveritySerializer(many=True)
97102
advisory_id = serializers.CharField(source="avid", read_only=True)
98103
related_ssvc_trees = serializers.SerializerMethodField()
99104

100105
def get_related_ssvc_trees(self, obj):
101-
related_ssvcs = obj.related_ssvcs.all().select_related("source_advisory")
102-
source_ssvcs = obj.source_ssvcs.all().select_related("source_advisory")
103-
104106
seen = set()
105107
result = []
106108

107-
for ssvc in list(related_ssvcs) + list(source_ssvcs):
109+
all_ssvcs = list(obj.related_ssvcs.all()) + list(obj.source_ssvcs.all())
110+
111+
for ssvc in all_ssvcs:
108112
key = (ssvc.vector, ssvc.source_advisory_id)
109113
if key in seen:
110114
continue
@@ -399,7 +403,34 @@ def create(self, request, *args, **kwargs):
399403

400404
purls = serializer.validated_data["purls"]
401405

402-
latest_advisories = AdvisoryV2.objects.latest_advisories_for_purls(purls=purls)
406+
latest_advisories = AdvisoryV2.objects.latest_advisories_for_purls(
407+
purls=purls
408+
).prefetch_related(
409+
Prefetch(
410+
"references",
411+
queryset=AdvisoryReference.objects.only(
412+
"id",
413+
"url",
414+
"reference_type",
415+
"reference_id",
416+
),
417+
),
418+
Prefetch(
419+
"severities",
420+
queryset=AdvisorySeverity.objects.only(
421+
"id",
422+
"url",
423+
"value",
424+
"scoring_system",
425+
"scoring_elements",
426+
"published_at",
427+
),
428+
),
429+
"weaknesses",
430+
"aliases",
431+
"related_ssvcs__source_advisory",
432+
"source_ssvcs__source_advisory",
433+
)
403434

404435
page = self.paginate_queryset(latest_advisories)
405436
serializer = self.get_serializer(page, many=True, context={"request": request})

vulnerabilities/tests/test_api_v3.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ def test_packages_post_purl_with_many_advisories(self):
193193
def test_advisories_post(self):
194194
url = reverse("advisory-v3-list")
195195

196-
with self.assertNumQueries(64):
196+
with self.assertNumQueries(10):
197197
response = self.client.post(
198198
url,
199199
data={"purls": ["pkg:pypi/sample@1.0.0"]},

0 commit comments

Comments
 (0)