Django Фильтрация данных для получения лучшего спортсмена по каждому событию

OK, я в затруднительном положении с этим запросом. Я хочу создать запрос, который возвращает лучшие результаты в каждом виде соревнований (отдельно для мужчин и женщин). Вот структура моей модели:

class Athlete(models.Model):
    Graduation = models.IntegerField()
    Athlete = models.CharField(max_length=200, null=True)
    Male = models.BooleanField()
    Active = models.BooleanField()
    First = models.CharField(max_length=200, blank=True)
    Last = models.CharField(max_length=200, blank=True)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.Athlete

class Meet(models.Model):
    MeetName = models.TextField()
    State = models.BooleanField()
    Indoor = models.BooleanField()
    Location =  models.CharField(max_length=200, null=True)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.MeetName

class Event(models.Model):
    EventName = models.CharField(max_length=200, null=True)
    FieldEvent = models.BooleanField()
    Current = models.BooleanField()
    Relay = models.BooleanField()
    Order = models.IntegerField()
    MeasurementSystem = models.CharField(max_length=20)
    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)
    def __str__(self):
        return self.EventName

class Performance(models.Model):
    EventID = models.ForeignKey(Event, on_delete=models.SET_NULL,null=True)
    Mark = models.CharField(max_length=200, null=True)
    MarkRawLarge = models.IntegerField()
    MarkRawSmall = models.DecimalField(decimal_places=3,max_digits=20)
    MeetID = models.ForeignKey(Meet, on_delete=models.SET_NULL,null=True)
    PerformanceNote = models.CharField(max_length=10,null=True,blank=True)
    CY = models.IntegerField(null=True)
    EventDate = models.DateField(null=True)
    Notes = models.TextField(null = True,blank=True)
    Archive = models.BooleanField()
    StateChamp = models.BooleanField(null=True)
    AthleteID = models.ManyToManyField(Athlete)
    Confirmed = models.BooleanField(null=False,default=False)
    Locked = models.BooleanField(null=False,default=False)

    updated = models.DateTimeField(auto_now=True)
    created = models.DateTimeField(auto_now_add=True)

У меня есть 4 запроса, которые успешно выдают десять лучших спортсменов в определенной категории, как показано здесь (выдержка кода из views.py) Примечание: я использую аннотацию для "AthleteID", поскольку некоторые соревнования имеют несколько спортсменов (например, эстафеты), так что это предотвращает появление эстафеты несколько раз в выражении запроса. (Я использовал sum, но думаю, что count тоже подошел бы)

views.py
if FieldEvent == 1:
       performancesmen =   Performance.objects.filter(EventID=pk,AthleteID__Male=True,Archive=0,Confirmed=1).\
                        order_by('-MarkRawLarge','-MarkRawSmall').annotate(total_athletes=Sum('AthleteID'))[0:10]
       performanceswomen = Performance.objects.filter(EventID=pk,AthleteID__Male=False,Archive=0,Confirmed=1).\
                    order_by('-MarkRawLarge','-MarkRawSmall').annotate(total_athletes=Sum('AthleteID'))[0:10]
else:  
       performancesmen =   Performance.objects.filter(EventID=pk,AthleteID__Male=True,Archive=0,Confirmed=1).\
                        order_by('MarkRawLarge','MarkRawSmall').annotate(total_athletes=Sum('AthleteID'))[0:10]
       performanceswomen = Performance.objects.filter(EventID=pk,AthleteID__Male=False,Archive=0,Confirmed=1).\
                        order_by('MarkRawLarge','MarkRawSmall').annotate(total_athletes=Sum('AthleteID'))[0:10]

Примечание: в полевых видах сначала указывается наибольший результат, а в беговых видах - наименьший. Также, "RawMarkLarge/RawMarkSmall" используются для хранения значений в зависимости от того, бег это или дистанция. В "Large" хранятся минуты или футы (всегда целое число), а в "Small" - секунды/дюймы (иногда дробь, поэтому должна быть плавающей).

Как написать выражение запроса в Django для отображения лучшего спортсмена в каждом виде (для всех видов)? Было бы хорошо иметь 4 запроса (Мужское поле, Мужской бег, Женское поле, Женский бег)

Спасибо.

Вернуться на верх