Как я получаю положение результата в списке после order_by?

Я пытаюсь найти эффективный способ найти разряд объекта в базе данных связанным с, он - счет. Мое наивное решение похоже на это:

rank = 0
for q in Model.objects.all().order_by('score'):
  if q.name == 'searching_for_this'
    return rank
  rank += 1

Должно быть возможно заставить базу данных делать фильтрацию, с помощью order_by:

Model.objects.all () .order_by ('счет') .filter (называют ='searching_for_this'),

Но, кажется, нет способа получить индекс для шага order_by после фильтра.

Существует ли лучший способ сделать это? (Используя python/django и/или необработанный SQL.)

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

7
задан Bob Bob 17 April 2010 в 17:09
поделиться

3 ответа

Я не думаю, что вы можете сделать это в одном запросе к базе данных с помощью Django ORM. Но если вас это не беспокоит, я бы создал собственный метод для модели:

from django.db.models import Count

class Model(models.Model):
    score = models.IntegerField()
    ...

    def ranking(self):
        aggregate = Model.objects.filter(score__lt=self.score).aggregate(ranking=Count('score'))
        return aggregate['ranking'] + 1

Затем вы можете использовать «ранжирование» где угодно, как если бы это было обычное поле:

print Model.objects.get(pk=1).ranking
9
ответ дан 6 December 2019 в 11:47
поделиться

В "необработанном SQL" со стандартным механизмом базы данных (PostgreSql, SQL Server, Oracle, DB2, ...) вы можете просто использовать стандартную функцию SQL RANK - но это не поддерживается в популярных, но нестандартных движках, таких как MySql и Sqlite, и (возможно, из-за этого) Django не «предоставляет» эту функциональность приложению.

2
ответ дан 6 December 2019 в 11:47
поделиться

Используйте что-то вроде этого:

obj = Model.objects.get(name='searching_for_this')
rank = Model.objects.filter(score__gt=obj.score).count()

Вы можете предварительно вычислить ранги и сохранить их в Model, если они часто используются и влияют на производительность.

1
ответ дан 6 December 2019 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: