Звучит как-то странно, но это действительно простая идея. Я пытаюсь сделать простой Flickr для веб-сайта, который я создаю. Эта конкретная проблема возникает, когда я хочу показать одну фотографию (из моей Photo
модели) на странице, но я также хочу показать изображение перед ним в потоке и изображение после него.
Если бы я только сортировал эти потоки по дате или сортировал только по идентификатору, это было бы проще ... Но это не так. Я хочу позволить пользователю сортировать и фильтровать по целому ряду методов. Сортировка проста. Я сделал это, и у меня есть набор результатов, содержащий 0-многие Photo
с.
Если я хочу один Photo
, я начинаю с этого отфильтрованного / отсортированного / и т.д. потока. Из него мне нужно получить текущий Photo
, Photo
до него и Photo
после него.
Вот то, на что я сейчас смотрю.
prev = None
next = None
photo = None
for i in range(1, filtered_queryset.count()):
if filtered_queryset[i].pk = desired_pk:
if i>1: prev = filtered_queryset[i-1]
if i<filtered_queryset.count(): next = filtered_queryset[i+1]
photo = filtered_queryset[i]
break
Это только кажется отвратительно грязным. И неэффективно. Боже мой, так неэффективно. Кто-нибудь может улучшить это хотя?
Запросы Django имеют позднюю привязку, поэтому было бы неплохо использовать это, хотя я думаю, что это может быть невозможно, учитывая мои ужасные ограничения.
Редактировать: мне приходит в голову, что я могу просто добавить немного SQL для повторной фильтрации набора запросов. Если есть способ выбора чего-либо с двумя (или одним, или нулем) ближайшими соседями с помощью SQL, я бы хотел знать!