@@ -161,6 +161,7 @@ class VulnerabilitySeverity(models.Model):
161
161
max_length = 1024 ,
162
162
null = True ,
163
163
help_text = "URL to the vulnerability severity" ,
164
+ db_index = True ,
164
165
)
165
166
166
167
scoring_system_choices = tuple (
@@ -212,6 +213,7 @@ class Vulnerability(models.Model):
212
213
default = utils .build_vcid ,
213
214
help_text = "Unique identifier for a vulnerability in the external representation. "
214
215
"It is prefixed with VCID-" ,
216
+ db_index = True ,
215
217
)
216
218
217
219
summary = models .TextField (
@@ -453,6 +455,7 @@ class VulnerabilityReference(models.Model):
453
455
max_length = 200 ,
454
456
help_text = "An optional reference ID, such as DSA-4465-1 when available" ,
455
457
blank = True ,
458
+ db_index = True ,
456
459
)
457
460
458
461
objects = VulnerabilityReferenceQuerySet .as_manager ()
@@ -509,6 +512,7 @@ def get_fixed_by_package_versions(self, purl: PackageURL, fix=True):
509
512
if fix :
510
513
filter_dict ["fixing_vulnerabilities__isnull" ] = False
511
514
515
+ # TODO: why do we need distinct
512
516
return Package .objects .filter (** filter_dict ).distinct ()
513
517
514
518
def get_or_create_from_purl (self , purl : Union [PackageURL , str ]):
@@ -695,6 +699,7 @@ class Package(PackageURLMixin):
695
699
is_ghost = models .BooleanField (
696
700
default = False ,
697
701
help_text = "True if the package does not exist in the upstream package manager or its repository." ,
702
+ db_index = True ,
698
703
)
699
704
700
705
risk_score = models .DecimalField (
@@ -709,10 +714,36 @@ class Package(PackageURLMixin):
709
714
help_text = "Rank of the version to support ordering by version. Rank "
710
715
"zero means the rank has not been defined yet" ,
711
716
default = 0 ,
717
+ db_index = True ,
712
718
)
713
719
714
720
objects = PackageQuerySet .as_manager ()
715
721
722
+ class Meta :
723
+ unique_together = ["type" , "namespace" , "name" , "version" , "qualifiers" , "subpath" ]
724
+ ordering = ["type" , "namespace" , "name" , "version_rank" , "version" , "qualifiers" , "subpath" ]
725
+ indexes = [
726
+ # Index for getting al versions of a package
727
+ models .Index (fields = ["type" , "namespace" , "name" ]),
728
+ models .Index (fields = ["type" , "namespace" , "name" , "qualifiers" , "subpath" ]),
729
+ # Index for getting a specific version of a package
730
+ models .Index (
731
+ fields = [
732
+ "type" ,
733
+ "namespace" ,
734
+ "name" ,
735
+ "version" ,
736
+ ]
737
+ ),
738
+ ]
739
+
740
+ def __str__ (self ):
741
+ return self .package_url
742
+
743
+ @property
744
+ def purl (self ):
745
+ return self .package_url
746
+
716
747
def save (self , * args , ** kwargs ):
717
748
"""
718
749
Save, normalizing PURL fields.
@@ -738,17 +769,6 @@ def save(self, *args, **kwargs):
738
769
self .plain_package_url = str (plain_purl )
739
770
super ().save (* args , ** kwargs )
740
771
741
- @property
742
- def purl (self ):
743
- return self .package_url
744
-
745
- class Meta :
746
- unique_together = ["type" , "namespace" , "name" , "version" , "qualifiers" , "subpath" ]
747
- ordering = ["type" , "namespace" , "name" , "version_rank" , "version" , "qualifiers" , "subpath" ]
748
-
749
- def __str__ (self ):
750
- return self .package_url
751
-
752
772
@property
753
773
def calculate_version_rank (self ):
754
774
"""
@@ -981,12 +1001,14 @@ class PackageRelatedVulnerabilityBase(models.Model):
981
1001
package = models .ForeignKey (
982
1002
Package ,
983
1003
on_delete = models .CASCADE ,
1004
+ db_index = True ,
984
1005
# related_name="%(class)s_set", # Unique related_name per subclass
985
1006
)
986
1007
987
1008
vulnerability = models .ForeignKey (
988
1009
Vulnerability ,
989
1010
on_delete = models .CASCADE ,
1011
+ db_index = True ,
990
1012
# related_name="%(class)s_set", # Unique related_name per subclass
991
1013
)
992
1014
0 commit comments