Модель Django - как добавить аннотацию индекса заказа? - PullRequest
0 голосов
/ 08 февраля 2019

Как я могу аннотировать набор запросов в django, чтобы добавить дополнительное поле, которое будет представлять индекс (место) каждой строки в упорядоченном результате?

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

У меня есть такой код:

users = User.objects.all().annotate(total_points=Sum('score_earnings', distinct=True)).order_by('-total_points')

users = users.annotate(place, /* how to get an index of each ordered? */)

Это связанная с ней модель баллов:

class Score(models.Model):
    user = models.ForeignKey('users.CustomUser', related_name='score_earnings', on_delete=models.CASCADE)
    points = models.DecimalField(max_digits=8, decimal_places=1)

Таким образом, это поле place должно представлять индекс каждой строки в результате: 1, 2, 3, ...

Позже мне придется выбрать диапазон из результата и ожидать получениязначение place абсолютное поле:

users[3:6]

Ожидаемый результат:

[{
   "total_points": 100.0,
   "place": 3
}, {
   "total_points": 70.0,
   "place": 4
}, {
   "total_points": 50.0,
   "place": 5
}]

Я использую MySQL DB.

------------ Обновление ------------

Я смог сделать что-то подобное в SQL:

set @row_num = 0; 
SELECT name, @row_num := @row_num + 1 as row_index
FROM Users

Но это все еще не совсем то, что мне нужнопотому что, если я добавлю инструкцию LIMIT, значение row_index будет в новом результате ...

1 Ответ

0 голосов
/ 08 февраля 2019

Я делал подобный вид работы несколькими месяцами ранее.Я использовал postgres в качестве базы данных и django 2.0.Я не уверен, что следующий код решит вашу проблему или нет.Но я хочу поделиться своей частью кода, которая решает мою проблему.

from django.db.models import Window, F
from django.db.models.functions import DenseRank

 ranklist = Score.objects.annotate(
            place=Window(
                expression=DenseRank(),
                order_by=[
                    F('points').desc(),
                ]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...