Как получить наибольшее значение в модели django для каждого объекта

админ хочет добавить различные вызовы. каждый вызов имеет много пользователей. каждый пользователь может иметь много лайков. я хочу показать победителя каждого вызова. для этого мне нужно получить, какой кандидат получил наибольшее количество лайков. как я могу получить это. есть ли какой-нибудь способ типа .count.? Как я могу это использовать? В какой модели .

например :-

challenges
1  first_contest 
2  second_contest 

candidates 
id name contest
1  jhon first_contest
2  sara second_contest
3  abi  first_contest

candidates likes
id user_id candidate_id
1  1       1
2  2       2
3  1       1

в данном случае кадидат 1 = jhon получил 2 лайка, поэтому в первом конкурсе победил jhon. также во втором конкурсе sara получила 1 лайк. поэтому мне нужно показать победителя в первом конкурсе. как это сделать?

models.py

class Challenge(models.Model):
  title = models.CharField(max_length=50)

class Candidates(models.Model):
  owner = models.ForeignKey(User, on_delete=models.CASCADE)
  image = models.FileField( upload_to="challenge_candidates/",)
  def likes_count(self):
       return self.likes.all().count() 

class CandidateLikes(models.Model):
  like = models.CharField(max_length=10)
    user = 
  models.ForeignKey(User,on_delete=models.CASCADE,related_name='candidate_likes')
    contest_candidates = models.ForeignKey(Candidates, on_delete=models.CASCADE, 
  related_name='likes')

извините за мой плохой английский. спасибо.

Сначала вам нужно установить связь между вашей моделью CandidatLike и моделью Challenge, чтобы вы могли фильтровать по задачам. Отношения внешнего ключа может быть достаточно. Затем вы можете добавить этот запрос в ваши представления

winner = CandidateLikes.objects.filter(challenge="your_challenge_name").order_by("like")

Заметьте, что challenge должен существовать в вашей модели CandidatLike, поскольку мы фильтруем по нему.

Мне кажется, что вам не хватает связи между Challenge и Candidates. Допустим, вы добавляете поле Challenge в Candidate:

class Candidates(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    challenge = models.ForeignKey(Challenge, on_delete=models.CASCADE, related_name='candidates')

Затем вы можете запросить победителя каждого испытания с наибольшим количеством лайков с помощью подзапроса следующего содержания:

from django.db.models import Count
from django.db.models import OuterRef, Subquery

cadidates = Candidates.objects.annotate(like_count=Count('likes')).filter(challange=OuterRef('pk')).order_by('-like_count')
queryset = Challenge.objects.annotate(winner=Subquery(cadidates.values('owner__username')[:1]))

В результате вы получите запрос Challenge result с аннотированным победителем, например:

{'id': 1, 'title': 'Challange 1', 'winner': 'username'}
Вернуться на верх