@@ -2886,11 +2886,7 @@ def latest_for_avid(self, avid: str):
28862886 )
28872887
28882888 def latest_per_avid (self ):
2889- return self .order_by (
2890- "avid" ,
2891- F ("date_collected" ).desc (nulls_last = True ),
2892- "-id" ,
2893- ).distinct ("avid" )
2889+ return self .filter (is_latest = True )
28942890
28952891 def latest_for_avids (self , avids ):
28962892 return self .filter (avid__in = avids ).latest_per_avid ()
@@ -3007,6 +3003,7 @@ class AdvisoryV2(models.Model):
30073003 max_length = 200 ,
30083004 blank = False ,
30093005 null = False ,
3006+ db_index = True ,
30103007 help_text = "Unique ID for the datasource used for this advisory ." "e.g.: nginx_importer_v2" ,
30113008 )
30123009
@@ -3090,6 +3087,14 @@ class AdvisoryV2(models.Model):
30903087 help_text = "UTC Date on which the advisory was collected" ,
30913088 )
30923089
3090+ is_latest = models .BooleanField (
3091+ default = False ,
3092+ blank = False ,
3093+ null = False ,
3094+ db_index = True ,
3095+ help_text = "Indicates whether this is the latest version of the advisory identified by its AVID." ,
3096+ )
3097+
30933098 original_advisory_text = models .TextField (
30943099 blank = True ,
30953100 null = True ,
@@ -3142,6 +3147,11 @@ class AdvisoryV2(models.Model):
31423147 class Meta :
31433148 unique_together = ["datasource_id" , "advisory_id" , "unique_content_id" ]
31443149 ordering = ["datasource_id" , "advisory_id" , "date_published" , "unique_content_id" ]
3150+ constraints = [
3151+ models .UniqueConstraint (
3152+ fields = ["avid" ], condition = Q (is_latest = True ), name = "unique_latest_per_avid"
3153+ )
3154+ ]
31453155 indexes = [
31463156 models .Index (
31473157 fields = ["avid" , "-date_collected" , "-id" ],
0 commit comments