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 запроса (Мужское поле, Мужской бег, Женское поле, Женский бег)
Спасибо.