2014-01-30 52 views
0

我很喜歡Django,並喜歡它的已實現的分頁功能。不過,當我嘗試在多個頁面上分割隨機排序的查詢集時遇到問題。Django分頁隨機:order_by('?')

例如,我在查詢集中有100個元素,並希望一次顯示25個元素。將上下文對象提供爲隨機排列的查詢集(使用.order_by('?')規範),每次請求新頁面時(第2,3,4頁),都會將全新的查詢集加載到上下文中。

明確指出:我如何(或可以)請求單個查詢集,隨機排序,並將其顯示在易消化頁面中?

回答

1

來實現這一目標的最好方法是使用一些分頁APP,如:

我個人使用的第一個,它集成了相當不錯與乾草堆。

""" 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)。 在ajax調用的情況下,種子可以存儲在session/cookie /前端。

警告 - 有更好的辦法 這實際上是一個非常緩慢的操作。我發現this blog post描述了一個非常好的方法來檢索單個結果以及一組結果。 在這種情況下,種子將用於您的本地隨機數生成器。