Получить записи до и после текущего выбора в запросе Django - PullRequest
2 голосов
/ 06 октября 2009

Звучит как-то странно, но это действительно простая идея. Я пытаюсь сделать простой 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, я бы хотел знать!

Ответы [ 2 ]

1 голос
/ 07 октября 2009

Вы можете попробовать следующее:

  1. Оцените отфильтрованный / отсортированный набор запросов и получите список идентификаторов фотографий, которые вы держите в сеансе. Все эти идентификаторы соответствуют критериям фильтра / сортировки.
  2. Сохраните текущий индекс в этом списке и в сеансе и обновляйте его, когда пользователь переходит к предыдущей / следующей фотографии. Используйте этот индекс, чтобы получить предыдущие / текущие / следующие идентификаторы для отображения фотографий.
  3. Когда критерии фильтрации / сортировки изменяются, повторно оцените список и установите для текущего индекса подходящее значение (например, 0 для первой фотографии в новом списке).
1 голос
/ 07 октября 2009

вижу следующие возможности:

  1. Параметры вашего URL-запроса содержат информацию о сортировке / фильтрации и некий «номер элемента», которым является номер элемента в вашего отфильтрованного набора запросов. Это простой случай - предыдущий и следующий - номер элемента минус один и плюс один соответственно (плюс проверка некоторых границ)

  2. Вы хотите, чтобы URL был постоянной ссылкой и содержал первичный ключ фотографии (или некоторый уникальный идентификатор). В этом случае вы, вероятно, сохраняете сортировку / фильтрацию в:

    • в URL как параметры запроса. В этом случае у вас нет настоящих постоянных ссылок, и вы также можете вставить номер элемента в URL, чтобы вернуться к варианту 1.
    • скрытые поля на странице и использование POST для ссылок вместо обычных ссылок. В этом случае укажите номер товара в скрытых полях.
    • данные сессии / куки. Это сломается, если у пользователя есть две вкладки, открытые с применением разных видов сортировки / фильтрации, но это может быть ограничением, которое вы не возражаете - в конце концов, вы предполагали, что они, вероятно, просто будут использовать одну вкладку и нажимать по списку. В этом случае также сохраните номер позиции в сеансе. Возможно, вам удастся сделать что-то умное для «пространства имен» номера элемента в случае, если у них открыто несколько вкладок.

Короче говоря, храните номер позиции там, где вы храните информацию фильтрации / сортировки.

...