Оконный запрос 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, а не просто исключает из него нужные элементы?
Спасибо.