Как получить наибольшее значение в модели 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'}