|
9 | 9 |
|
10 | 10 | from urllib.parse import urlencode |
11 | 11 |
|
| 12 | +from django.db.models import Prefetch |
12 | 13 | from django_filters import rest_framework as filters |
13 | 14 | from packageurl import PackageURL |
14 | 15 | from rest_framework import serializers |
@@ -90,21 +91,24 @@ class Meta: |
90 | 91 |
|
91 | 92 |
|
92 | 93 | class AdvisoryV3Serializer(serializers.ModelSerializer): |
93 | | - aliases = serializers.SerializerMethodField() |
| 94 | + aliases = serializers.SlugRelatedField( |
| 95 | + many=True, |
| 96 | + read_only=True, |
| 97 | + slug_field="alias", |
| 98 | + ) |
94 | 99 | weaknesses = AdvisoryWeaknessSerializer(many=True) |
95 | 100 | references = AdvisoryReferenceSerializer(many=True) |
96 | 101 | severities = AdvisorySeveritySerializer(many=True) |
97 | 102 | advisory_id = serializers.CharField(source="avid", read_only=True) |
98 | 103 | related_ssvc_trees = serializers.SerializerMethodField() |
99 | 104 |
|
100 | 105 | 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 | | - |
104 | 106 | seen = set() |
105 | 107 | result = [] |
106 | 108 |
|
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: |
108 | 112 | key = (ssvc.vector, ssvc.source_advisory_id) |
109 | 113 | if key in seen: |
110 | 114 | continue |
@@ -399,7 +403,34 @@ def create(self, request, *args, **kwargs): |
399 | 403 |
|
400 | 404 | purls = serializer.validated_data["purls"] |
401 | 405 |
|
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 | + ) |
403 | 434 |
|
404 | 435 | page = self.paginate_queryset(latest_advisories) |
405 | 436 | serializer = self.get_serializer(page, many=True, context={"request": request}) |
|
0 commit comments