【问题标题】:Django pagination random: order_by('?')Django 分页随机:order_by('?')
【发布时间】:2014-02-22 01:16:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: django random pagination django-queryset


    【解决方案1】:

    我最近遇到了同样的问题,我不想缓存所有结果。 我为解决这个问题所做的是 .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/您的前端。

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

    【讨论】:

    • 我已经设法cursor.execute("SELECT setseed(%s);" % seed),然后立即阅读/构建查询集,它也可以正常工作。为什么?我需要一个真正的查询集,包含所有的花里胡哨(在 django-oscar 中......)。 objects.raw() 提供了某种简化的列表样式结果......无论如何,这个答案是解决方案的方法。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      我个人使用第一个,它与 Haystack 集成得很好。

       """ EXAMPLE: (django-pagination) """
           #paginate 10 results.
      
          {% autopaginate my_query 10 %}
      

      【讨论】:

        猜你喜欢
        • 2012-04-26
        • 2014-11-15
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 1970-01-01
        • 2016-09-29
        相关资源
        最近更新 更多