Внедрение алгоритма ранжирования в запросы Django

В настоящее время у меня хранятся upvotes и downvotes. Я пытаюсь сделать алгоритм ранжирования таким

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 upvote 0 downvotes нормально. Но затем он помещает 6 upvotes, и 1 downvote внизу, вместо номера 2.

Так что я думаю, что журнал исправит это, но если нет, то я не знаю, каким будет эквивалентное исправление.

Наконец-то я разобрался с этим, проверив документацию django. Там говорится здесь

"Объединение нескольких агрегаций с помощью annotate() даст неверные результаты, поскольку вместо подзапросов используются объединения":

Так что решение заключалось в том, чтобы изменить аннотацию и включить distinct=True в графу, как это было

).annotate(total_votes=Count('userUpVotes', distinct=True) - Count('userDownVotes', distinct=True)).order_by('-total_votes')
Вернуться на верх