2015-01-02 21 views
1

我有這樣過濾查詢集與索引的列表

QS = SomeModel.objects.filter(some_filter='filter_value') 

我需要隨機選擇n在這個元件一個QuerySet,所以產生的N個隨機數的列表0之間QS的長度,進一個列表變量idx_list。

現在,我可以循環訪問idx_list,並從QS中每次選取一個元素,但是,我可以在沒有循環的情況下在一行中執行它嗎?

+1

可能重複的[如何獲得兩個隨機記錄與Django](http://stackoverflow.com/questions/1731346/how-to-get-two-random-records-with-django) –

回答

0

如果你想獲取從數據庫項目和超過您可以選擇使用.order_by('?')以隨機順序對象,也比使用生成的ID列表

你可以只讀取ID的隨機順序values_list()

idx_list = SomeModel.objects.filter(some_filter='filter_value').order_by('?').values_list('id', flat=True)[:x] 

或者你可以獲取查詢集:只要你想

QS = SomeModel.objects.filter(some_filter='filter_value').order_by('?') 

在然後切片儘可能多的項目:

# Get id's of random x elements 
idx_list = map(lambda item: item.id, list(QS[0:x])) 
+1

請注意,這種方法會讓服務器爬到一個角落哭幾個星期,在它吐出磁盤I/O瓶頸之前填滿內存,並且在吐出可以在不到一秒鐘內完成的結果之前,不對任何人或任何東西做出響應。請忘記'order_by('?')'曾經存在。 – knbk

+1

並非每個人都有帶有100k +記錄的數據庫表。不是每個人都需要簡單案例中的奇特解決方案 –

+0

非常感謝Secator,但是我擔心'?'的表現,因爲我需要在每次用戶請求的幾千條記錄上重複執行幾次這種過濾,並且在任何時候都可能有幾千個用戶。我現在保持循環:[QS(j)for j in random.sample(range(1,len(QS)),n)],你怎麼看? – pkc