Порядок 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')
Вернуться на верх