Как получить следующую строку в наборе запросов Django? - PullRequest
7 голосов
/ 13 февраля 2011

У меня есть набор запросов, который вернет несколько строк.В одной из строк есть слаг «slug-456», как мне перейти к следующей строке после того, как в этой строке есть слаг «slug-456» относительно текущего порядка в наборе запросов?переберите набор запросов и проверьте, есть ли в текущей строке слаг «slug-456», и если он принимает к сведению, что следующая строка - это то, что мне нужно, но есть ли более эффективный способ?1005 * ОБНОВЛЕНИЕ: Я сделал это так:

id_list = list(qs.values_list('id', flat=True))
try:
    next_id = id_list[id_list.index(obj.id) + 1]
    obj = Object.objects.get(id=next_id)
except IndexError:
    pass

Ответы [ 2 ]

7 голосов
/ 13 февраля 2011

Для py <2,6, </p>

queryset.iterator().next()

Для> = 2,6

next(queryset.iterator())

следует сделать трюк

6 голосов
/ 13 февраля 2011

Querysets являются генераторами, поэтому на самом деле не существует ярлыка, аналогичного qs[qs.indexof(slug="..")+1].Любое решение, которое вы придумали, все еще требует итерации по набору запросов (по крайней мере, до целевого объекта).

Как вы упомянули, возможный способ сделать это состоял бы в том, чтобы пройтись по набору запросов и вернуть один сразу послеодин с slug = "slug-456".

Конечно, вы можете выбрать более запутанный маршрут и сделать что-то вроде:

# get slugs in order
sio = list(qs.objects.values_list('slug', flat=True))
target_slug = sio[sio.index(sio) + 1] # watch for KeyError
your_object = qs.objects.get(slug__exact=target_slug)

, хотя и забавно писать, этомаловероятно, что это даст какой-либо выигрыш в производительности (если ваша модель не имеет много полей, и в этом случае может оказаться целесообразным повторение вывода values_list() first).

Связанный ответ: Получите индекс элемента вQuerySet .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...