Django分页随机:order_by('?')

时间:2014-01-30 23:38:40

标签: django random pagination django-queryset

我喜欢Django,喜欢它实现的分页功能。但是,在尝试跨多个页面拆分随机排序的查询集时遇到问题。

例如,我在查询集中有100个元素,并希望一次显示25个元素。将上下文对象作为随机排序的查询集(使用.order_by('?')规范),每次请求新页面时都会将一个全新的查询集加载到上下文中(第2,3,4页)。

明确说明:我如何(或可以)请求单个查询集,随机排序,并在可消化页面上显示它?

3 个答案:

答案 0 :(得分: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)。 在ajax调用的情况下,种子可以存储在session / a cookie / your frontend中。

警告 - 有更好的方法 这实际上是一个非常慢的操作。我发现this blog post描述了一种非常好的方法,既可以检索单个结果,也可以检索结果集。 在这种情况下,种子将在您的本地随机数生成器中使用。

答案 1 :(得分:1)

我认为这个非常好的答案对您有用:How to have a "random" order on a set of objects with paging in Django?

基本上他建议缓存对象列表并用会话变量引用它,因此可以在页面之间维护(使用django分页)。

或者您可以手动随机化列表并传递种子以维护同一用户的随机化!

答案 2 :(得分:1)

实现这一目标的最佳方法是使用一些分页APP,如:

我个人使用第一个,它与Haystack很好地融合。

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

    {% autopaginate my_query 10 %}
相关问题