繁体   English   中英

Django按投票百分比排序

[英]Django order by vote percentage

我目前有一个帖子有赞成票和反对票。

模型看起来像这样

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')

但我不确定接下来要做什么才能让它排名靠前,比如获得最多赞成票和反对票的那个。

你火腿多对多领域,你应该使用:

from django.db.models import F, Sum, Count

words = Word.objects.filter(name__iexact='test').annotate(
    total_votes=Count('upvotes') - Count('downvotes')).order_by('-total_votes')

或在您的回答中:

from django.db.models import F, Sum, Count
from django.db.models.functions.comparison import NullIf

words = Word.objects.filter(name__iexact='test').annotate(
    total_votes=Count('upvotes') / NullIf(
        Count('upvotes') + Count('downvotes')
    )).order_by('-total_votes')

我发帖后才意识到,我必须将赞成票除以总票数,然后倒序排列。

words = Word.objects.filter(name__iexact='test').annotate(
            total_votes=Sum(F('upvotes'))/Sum(F('upvotes') + F('downvotes'))).order_by('-total_votes')

您可以使用Count表达式 [Django-doc]distinct=True [Django-doc] ,否则您将在有反对票的情况下计算赞成票,反之亦然。 因此,我们可以通过以下方式确定点赞的份额:

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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM