Я пытаюсь найти эффективный способ найти разряд объекта в базе данных связанным с, он - счет. Мое наивное решение похоже на это:
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.)
Моя следующая мысль состоит в том, чтобы предварительно вычислить разряды на вставке, но это кажется грязным.
Я не думаю, что вы можете сделать это в одном запросе к базе данных с помощью 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
В "необработанном SQL" со стандартным механизмом базы данных (PostgreSql, SQL Server, Oracle, DB2, ...) вы можете просто использовать стандартную функцию SQL RANK
- но это не поддерживается в популярных, но нестандартных движках, таких как MySql и Sqlite, и (возможно, из-за этого) Django не «предоставляет» эту функциональность приложению.
Используйте что-то вроде этого:
obj = Model.objects.get(name='searching_for_this')
rank = Model.objects.filter(score__gt=obj.score).count()
Вы можете предварительно вычислить ранги и сохранить их в Model, если они часто используются и влияют на производительность.