2014-01-30 3 views
0

Я люблю Django и люблю его реализованные функции разбиения на страницы. Тем не менее, я сталкиваюсь с проблемами при попытке разбить случайно упорядоченный запрос на несколько страниц.Django pagination random: order_by ('?')

Например, у меня есть 100 элементов в наборе запросов и вы хотите отображать их по 25 за раз. Предоставление объекту контекста в виде набора запросов, упорядоченного случайным образом (с помощью спецификации .order_by ('?'), В новый контекст загружается совершенно новый запрос каждый раз, когда запрашивается новая страница (стр. 2, 3, 4).

Явно заявлено: как я (или могу ли я) запросить единый набор запросов, произвольно упорядоченный и отображать его на удобоваримых страницах?

ответ

1

я думаю, что это действительно хороший ответ будет полезным для вас: How to have a "random" order on a set of objects with paging in Django?

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

или вы можете вручную рандомизировать список и передать семя, чтобы сохранить рандомизацию для того же пользователя!

1

Самый лучший способ для того чтобы достигнуть этого использовать некоторые постраничной APP как:

Лично я использую первый, она объединяет очень хорошо с Haystack.

""" EXAMPLE: (django-pagination) """ 
    #paginate 10 results. 

    {% autopaginate my_query 10 %} 
2

Я столкнулся с той же проблемой в последнее время, когда мне не захотелось кэшировать все результаты. То, что я сделал для решения этой проблемы, было комбинацией .extra() и raw(). Это то, что он выглядит следующим образом:

raw_sql = str(queryset.extra(select={'sort_key': 'random()'}) 
          .order_by('sort_key').query) 
set_seed = "SELECT setseed(%s);" % float(random_seed) 
queryset = self.model.objects.raw(set_seed + raw_sql) 

Я считаю, что это будет работать только для Postgres. Выполнение подобной вещи в MySQL, вероятно, проще, поскольку вы можете передать семя непосредственно на RAND(123). Семя может храниться в сеансе/файл cookie/ваш интерфейс в случае вызовов ajax.

Предупреждение - есть лучший способ Это на самом деле очень медленная операция. Я нашел, что this blog post описывает очень хороший метод как для получения единственного результата, так и для набора результатов. В этом случае семя будет использоваться в вашем локальном генераторе случайных чисел.