2012-04-05 36 views
0

我有一個表格有一組13個複選框,這些複選框一起構成了我的搜索條件......除了我還爲ALL或ANY添加了一對單選按鈕。尋找Django任何()和所有()查詢集

,我希望能與喜歡的事優雅閃避:

priority_ids = request.GET.getlist("priority") # checkboxes 
collection = request.GET.get("collection") # radio buttons 
priorities = [] 
for priority_id in priority_ids: 
    priorities.append(Q(focus__priority=priority_id)) 
if (collection == "any"): qset = any(priorities) 
elif (collection == "all"): qset = all(priorities) 

然而,任何()和所有()返回一個布爾值,不是我能在過濾器中使用的查詢集。我想要一個與「Q(...)| Q(...)| Q(...)」或「Q(...)等效的」任何「或」全部「。 。)& Q(...)「適用於1至13條任何標準。

回答

1

Django沒有什麼需要做的。您只需將Q -s與&|相結合,以簡單的循環或以更緊湊的方式與reduce結合使用。

而關於術語,在我看來,你打電話給Q查詢集,但事實並非如此。它是一個查詢集上的過濾器。 類似下面的應該工作:

priority_ids = request.GET.getlist("priority") 
collection = request.GET.get("collection") 
priority_filters = [] 
for priority_id in priority_ids: 
    priority_filters.append(Q(focus__priority=priority_id)) 

base_qs = SomeModel.objects.all() 

if collection == "any": 
    filtered_qset = base_qs.filter(reduce(operator.or_, priority_filters)) 
elif collection == "all": 
    filtered_qset = base_qs.filter(reduce(operator.and_, priority_filters)) 
+1

請注意,你的'lambda's可以通過'operator.or_'和'operator.and_',分別取代。 – Dougal 2012-04-06 20:05:05

+0

+1,謝謝指出 – 2012-04-07 18:39:22

+0

雖然我們在這裏,不妨在priority_ids中爲p_id設置'priority_filters = [Q(focus__priority = p_id)]':) – Dougal 2012-04-07 18:46:06