我喜欢Django,并且喜欢它实现的分页功能。但是,当试图将随机排序的查询集拆分到多个页面时,我会遇到一些问题。
例如,我在一个查询集中有100个元素,并希望一次显示它们25个。将上下文对象提供为随机排序的查询集(使用.order_by('?')(规范),每次请求新页面时,都会将一个全新的查询集加载到上下文中(第2、3、4页)。
明确声明:我(或我)如何请求一个查询集,随机排序,并在可消化的页面上显示它?
发布于 2014-01-30 23:53:34
我认为这个非常好的答案对你是有用的:如何在Django中对一组具有分页功能的对象进行“随机”排序?
基本上,他建议缓存对象列表并使用会话变量引用它,这样就可以在页面之间维护它(使用django分页)。
或者您可以手动将列表随机化,并传递一个种子来维护同一用户的随机化!
发布于 2014-02-21 17:16:11
最近我遇到了同样的问题,我不想缓存所有的结果。我为解决这个问题所做的是.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调用的情况下,种子可以存储在会话/cookie/您的前端。
警告-有一个更好的方法,,这实际上是一个非常缓慢的操作。我发现这篇博客文章描述了一种非常好的方法,既可以检索单个结果,也可以检索结果集。在这种情况下,种子将在本地随机数生成器中使用。
发布于 2014-01-31 00:17:09
实现这一目标的最佳方法是使用一些分页应用程序,如:
就我个人而言,我使用的第一个,它与海堆栈很好地集成。
""" EXAMPLE: (django-pagination) """
#paginate 10 results.
{% autopaginate my_query 10 %}https://stackoverflow.com/questions/21469800
复制相似问题