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

3
我非常喜欢 Django,并且很喜欢它实现的分页功能。然而,当我尝试跨多个页面拆分随机排序的 queryset 时,遇到了问题。
例如,我有一个包含100个元素的 queryset,希望以每页25个元素的方式显示它们。如果将 context 对象提供为随机排序的 queryset(使用 .order_by('?') 指定),则每次请求新页面(第2页、第3页、第4页)时,都会加载完全不同的新 queryset 。
明确说明:如何请求一次随机排序的单个 queryset,并将其跨可消化的页面进行显示?
3个回答

4

最近我也遇到了同样的问题,不想缓存所有结果。为了解决这个问题,我结合使用了.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调用)中可以存储种子。 警告-有更好的方法 这实际上是一项非常缓慢的操作。我发现这篇博客文章描述了一种非常好的方法,既可以检索单个结果,也可以检索结果集。 在这种情况下,种子将用于本地随机数生成器。

1
我已经成功执行了cursor.execute("SELECT setseed(%s);" % seed),然后在读取/构建查询集时也能正常工作。为什么呢?因为我需要一个真正的查询集,带有所有的功能(在django-oscar中...)。objects.raw()提供了一种缩减列表样式的结果...无论如何,这个答案是解决问题的方法。 - benzkji

2

1

实现这个的最好方法是使用一些分页应用程序,例如:

个人建议使用第一个,它与Haystack集成得非常好。

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

    {% autopaginate my_query 10 %}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接