在 Django 查询中实现排名算法
Implimenting a ranking algorithm in Django query
我目前存储了赞成票和反对票。我正在尝试制作这样的排名算法
ranking = log(upvotes - downvotes)
但是在 Django 中执行我的查询时,我使用 annotate
本身,并且不确定我将在 math.log
中添加到注释的什么地方以便它按日志对它进行排名?
这是代码
defeniciones = Palabra.objects.prefetch_related(
'tag_set'
).filter(
nombre__iexact=palabra,
aprobada=True
).annotate(total_votes=Count('userUpVotes') - Count('userDownVotes')).order_by('-total_votes')
从这里可以看出,https://diccionarioespañol.com/significado/wey/ 它对 1 票赞成票和 0 票反对票的排名很好。但随后将 6 票赞成票和 1 票反对票排在最后,而不是第 2 名。
所以我认为日志会解决这个问题,但如果不是,我不确定等效的修复方法是什么。
在检查了 django 文档后,终于弄明白了。它说 here
“将多个聚合与 annotate() 结合起来会产生错误的结果,因为使用的是连接而不是子查询:”
所以解决方案是更改注释以在计数中包含 distinct=True
像这样
).annotate(total_votes=Count('userUpVotes', distinct=True) - Count('userDownVotes', distinct=True)).order_by('-total_votes')
我目前存储了赞成票和反对票。我正在尝试制作这样的排名算法
ranking = log(upvotes - downvotes)
但是在 Django 中执行我的查询时,我使用 annotate
本身,并且不确定我将在 math.log
中添加到注释的什么地方以便它按日志对它进行排名?
这是代码
defeniciones = Palabra.objects.prefetch_related(
'tag_set'
).filter(
nombre__iexact=palabra,
aprobada=True
).annotate(total_votes=Count('userUpVotes') - Count('userDownVotes')).order_by('-total_votes')
从这里可以看出,https://diccionarioespañol.com/significado/wey/ 它对 1 票赞成票和 0 票反对票的排名很好。但随后将 6 票赞成票和 1 票反对票排在最后,而不是第 2 名。
所以我认为日志会解决这个问题,但如果不是,我不确定等效的修复方法是什么。
在检查了 django 文档后,终于弄明白了。它说 here
“将多个聚合与 annotate() 结合起来会产生错误的结果,因为使用的是连接而不是子查询:”
所以解决方案是更改注释以在计数中包含 distinct=True
像这样
).annotate(total_votes=Count('userUpVotes', distinct=True) - Count('userDownVotes', distinct=True)).order_by('-total_votes')