Оконный запрос RowNumber для ранжирования Hiscores - Django

Я пытаюсь создать представление игры с рейтингом для моего Django сайта, и у меня возникли некоторые проблемы.

Запрос у меня следующий:

row_number_rank = Window(
    expression=RowNumber(),
    partition_by=[F('score_type')],
    order_by=F('score').desc()
)

hiscores = Hiscore.objects.annotate(rank=row_number_rank).values()

Запрос выше работает отлично, и правильно присваивает каждой строке ранг в соответствии с тем, как она сравнивается с другими оценками в рамках каждого типа оценки.

Результатом этого является следующее:

{ 'id': 2, 'username': 'Bob', 'score_type': 'wins', 'score': 12, 'rank': 1 }
{ 'id': 1, 'username': 'John', 'score_type': 'wins', 'score': 5, 'rank': 2 }
{ 'id': 4, 'username': 'John', 'score_type': 'kills', 'score': 37, 'rank': 1 }
{ 'id': 3, 'username': 'John', 'score_type': 'kills', 'score': 5, 'rank': 2 }
{ 'id': 5, 'username': 'Bob', 'score_type': 'kills', 'score': 2, 'rank': 3 }  

Проблема возникает, когда я хочу получить только оценки конкретного пользователя из вышеприведенных результатов. Если я добавлю filter(username="Bob"), то запрос будет выглядеть следующим образом:

row_number_rank = Window(
    expression=RowNumber(),
    partition_by=[F('score_type')],
    order_by=F('score').desc()
)

hiscores = Hiscore.objects.annotate(rank=row_number_rank).filter(username='Bob').values()

Неожиданно, добавление этого шага фильтрации дало следующие неправильные результаты:

{ 'id': 2, 'username': 'Bob', 'score_type': 'wins', 'score': 12, 'rank': 1 }
{ 'id': 5, 'username': 'Bob', 'score_type': 'kills', 'score': 2, 'rank': 1 }  

Случайным образом ранг в записи id=5 решил измениться на 1 вместо его правильного значения 3.

Почему добавление этого шага фильтрации изменяет значения полей в QuerySet, а не просто исключает из него нужные элементы?

Спасибо.

Вернуться на верх