@@ -161,6 +161,7 @@ class VulnerabilitySeverity(models.Model):
161161 max_length = 1024 ,
162162 null = True ,
163163 help_text = "URL to the vulnerability severity" ,
164+ db_index = True ,
164165 )
165166
166167 scoring_system_choices = tuple (
@@ -212,6 +213,7 @@ class Vulnerability(models.Model):
212213 default = utils .build_vcid ,
213214 help_text = "Unique identifier for a vulnerability in the external representation. "
214215 "It is prefixed with VCID-" ,
216+ db_index = True ,
215217 )
216218
217219 summary = models .TextField (
@@ -453,6 +455,7 @@ class VulnerabilityReference(models.Model):
453455 max_length = 200 ,
454456 help_text = "An optional reference ID, such as DSA-4465-1 when available" ,
455457 blank = True ,
458+ db_index = True ,
456459 )
457460
458461 objects = VulnerabilityReferenceQuerySet .as_manager ()
@@ -509,6 +512,7 @@ def get_fixed_by_package_versions(self, purl: PackageURL, fix=True):
509512 if fix :
510513 filter_dict ["fixing_vulnerabilities__isnull" ] = False
511514
515+ # TODO: why do we need distinct
512516 return Package .objects .filter (** filter_dict ).distinct ()
513517
514518 def get_or_create_from_purl (self , purl : Union [PackageURL , str ]):
@@ -695,6 +699,7 @@ class Package(PackageURLMixin):
695699 is_ghost = models .BooleanField (
696700 default = False ,
697701 help_text = "True if the package does not exist in the upstream package manager or its repository." ,
702+ db_index = True ,
698703 )
699704
700705 risk_score = models .DecimalField (
@@ -709,10 +714,36 @@ class Package(PackageURLMixin):
709714 help_text = "Rank of the version to support ordering by version. Rank "
710715 "zero means the rank has not been defined yet" ,
711716 default = 0 ,
717+ db_index = True ,
712718 )
713719
714720 objects = PackageQuerySet .as_manager ()
715721
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+
716747 def save (self , * args , ** kwargs ):
717748 """
718749 Save, normalizing PURL fields.
@@ -738,17 +769,6 @@ def save(self, *args, **kwargs):
738769 self .plain_package_url = str (plain_purl )
739770 super ().save (* args , ** kwargs )
740771
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-
752772 @property
753773 def calculate_version_rank (self ):
754774 """
@@ -981,12 +1001,14 @@ class PackageRelatedVulnerabilityBase(models.Model):
9811001 package = models .ForeignKey (
9821002 Package ,
9831003 on_delete = models .CASCADE ,
1004+ db_index = True ,
9841005 # related_name="%(class)s_set", # Unique related_name per subclass
9851006 )
9861007
9871008 vulnerability = models .ForeignKey (
9881009 Vulnerability ,
9891010 on_delete = models .CASCADE ,
1011+ db_index = True ,
9901012 # related_name="%(class)s_set", # Unique related_name per subclass
9911013 )
9921014
0 commit comments