Внедрение алгоритма ранжирования в запросы 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')