我很喜歡Django,並喜歡它的已實現的分頁功能。不過,當我嘗試在多個頁面上分割隨機排序的查詢集時遇到問題。Django分頁隨機:order_by('?')
例如,我在查詢集中有100個元素,並希望一次顯示25個元素。將上下文對象提供爲隨機排列的查詢集(使用.order_by('?')規範),每次請求新頁面時(第2,3,4頁),都會將全新的查詢集加載到上下文中。
明確指出:我如何(或可以)請求單個查詢集,隨機排序,並將其顯示在易消化頁面中?
我很喜歡Django,並喜歡它的已實現的分頁功能。不過,當我嘗試在多個頁面上分割隨機排序的查詢集時遇到問題。Django分頁隨機:order_by('?')
例如,我在查詢集中有100個元素,並希望一次顯示25個元素。將上下文對象提供爲隨機排列的查詢集(使用.order_by('?')規範),每次請求新頁面時(第2,3,4頁),都會將全新的查詢集加載到上下文中。
明確指出:我如何(或可以)請求單個查詢集,隨機排序,並將其顯示在易消化頁面中?
我覺得這真的很好的答案將是對你有用:How to have a "random" order on a set of objects with paging in Django?
基本上他建議將緩存中的對象列表,並指它與會話變量,因此它可以在頁面之間保持(使用Django分頁)。
或者您可以手動隨機化列表並傳遞種子來維護同一用戶的隨機數!
來實現這一目標的最好方法是使用一些分頁APP,如:
我個人使用的第一個,它集成了相當不錯與乾草堆。
""" EXAMPLE: (django-pagination) """
#paginate 10 results.
{% autopaginate my_query 10 %}
我最近遇到了同樣的問題,我不想緩存所有的結果。 我做了什麼來解決這個問題是.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描述了一個非常好的方法來檢索單個結果以及一組結果。 在這種情況下,種子將用於您的本地隨機數生成器。