2013-07-16 29 views
1

我試圖做這樣的邏輯:Django的 - 1.選擇2.過濾器3.然後切

1. take all objects 
2. filter them: all objs which has rate value >= 4 
3. then take randomly 4 out of them. 

我如何可以採取隨機4了出來?不只是從年底

切割這是我的代碼:
MyObj.objects.filter(objects__rate__gte=4).distinct('id').order_by('-id')[:4]

+0

我想,我可以做''ORDER_BY( '?')'',對不對? – doniyor

+0

注意:order_by('?')查詢可能很昂貴並且很慢,這取決於您使用的數據庫後端 – liuzhijun

回答

1

Django的具有隨機排序的選項。這是通過使用.order_by('?')完成的。

所以,你的代碼將是:

MyObj.objects.filter(rate__gte=4).distinct('id').order_by('?')[:4] 

據Django文檔可以是觀點在這裏https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by

+0

DatabaseError:SELECT DISTINCT ON表達式必須匹配初始ORDER BY表達式 LINE 1:SELECT DISTINCT ON(「home_location」。 「id」)「home_location」。「我... – doniyor

+0

檢查https://code.djangoproject.com/ticket/19195這是你的問題嗎? –

+0

你試過切換orderby和不同? –

1
foo = MyObj.objects.filter(objects__rate__gte=4) # step 1 & 2 
random.sample(list(foo), 4) # step 3 (will contain duplicates) 
random.sample(set(foo), 4) # step 3, only uniques