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