Порядок Django по проценту голосов
В настоящее время у меня есть сообщение, которое имеет upvotes и downvotes.
модель выглядит примерно так
class Word(models.Model):
name = models.CharField(max_length=250)
upvotes = models.ManyToManyField(User, blank=True, related_name='threadUpVotes')
downvotes = models.ManyToManyField(User, blank=True, related_name='threaddDownVotes')
в моем файле views.py у меня пока получилось следующее
from django.db.models import F, Sum
words = Word.objects.filter(name__iexact='test').annotate(
total_votes=Sum(F('upvotes') + F('downvotes'))).order_by('total_votes')
Но я не знаю, что делать дальше, чтобы он ранжировался, скажем, по наибольшему количеству upvotes и downvotes.
Я понял, что после того, как я написал, я должен был разделить upvotes на общее количество голосов и упорядочить в обратном порядке.
words = Word.objects.filter(name__iexact='test').annotate(
total_votes=Sum(F('upvotes'))/Sum(F('upvotes') + F('downvotes'))).order_by('-total_votes')
Вы используете поле "многие ко многим", вы должны использовать:
from django.db.models import F, Sum, Count
words = Word.objects.filter(name__iexact='test').annotate(
total_votes=Sum(Count('upvotes') - Count('downvotes'))).order_by('-total_votes')
или в вашем ответе:
from django.db.models import F, Sum, Count
words = Word.objects.filter(name__iexact='test').annotate(
total_votes=Sum(Count('upvotes') / (Count('upvotes') + Count('downvotes')))).order_by('-total_votes')
Вы можете использовать выражение Count
[Django-doc] с distinct=True
[Django-doc], иначе вы будете считать upvote столько раз, сколько есть downvotes и наоборот. Таким образом, мы можем определить долю upvotes с помощью:
from django.db.models import Count
words = Word.objects.filter(
name__iexact='test'
).annotate(
total_votes=Count('upvotes', distinct=True) / (Count('upvotes', distinct=True) + Count('downvotes', distinct=True))
).order_by('total_votes')