[英]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.