2016-04-17 3 views
0

У меня есть функция, которая принимает объект id. С помощью этого id я могу получить объект таблицы object_1 = Object.objects.get(pk=id). Я бы хотел, чтобы таблица Object была заказана по названию голосов. Например, objects = Object.objects.order_by('-votes') и я хотел бы найти позицию object_1 в objects.Django запрошенные объекты заданные позиции

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

Пурпур всего этого состоит в том, чтобы показать рейтинг, упорядоченный по голосам, в котором я показываю только 6 записей, а 4-й должен быть одним из объектов. Например, если я искал для объекта 1, я должен показать это:

Position | Name | Votes 
    5  obj5  52 
    6  obj3  49 
    7  obj10 49 
    8  obj1  47 
    9  obj15 15 
    10  obj6  14 

Так что я хотел бы получить запрос набор с obj5,obj3,obj10,obj1,obj15,obj6 в этом порядке. Оптимальным решением было бы сделать что-то вроде: objects = Object.objects.order_by('-votes')[x-4:x+2] где x - это позиция объекта, который я ищу.

пс: Я использую Python 2.7.9 и Django 1.9

ответ

0

Вы можете найти положение объекта с помощью простого подсчета запроса - что-то вроде этого:

object_1 = Object.objects.get(pk=id) 

# Count how many items have more votes than this one 
# This effectively tells you the position in your ordered list 
position = Object.objects.filter(votes__gt=object_1.votes).count() 

# Now generate your list of nearby objects 
objects = Object.objects.order_by('-votes')[position-4:position+2] 

(Примечание: это пример должен быть изменен для position < 4. Вам также потребуется некоторая логика для обеспечения детерминированного порядка в тех случаях, когда объекты имеют одинаковое количество голосов.)

+0

Это будет сделано сейчас, спасибо! – lpares12

Смежные вопросы