2012-04-05 12 views
0

私は検索条件を構成する13個のチェックボックスのグループを持つフォームを持っていますが、ALLまたはANYのラジオボタンも追加しました。 Django any()とquerysetsのall()を探しています

は、私のような上品な何かを離れて得るために期待していた。

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(...)と同等の機能を持つ"すべて " 。& Q(...) "は、1から13までの任意の基準です。

答えて

1

Djangoはそれについて何もする必要はありません。 Q -sを&とそれぞれ組み合わせて、|を単純なループで、またはよりコンパクトな方法でreduceと組み合わせるだけです。

用語に関しては、Qをクエリセットと呼んでいるようですが、そうではありません。クエリーセットのフィルターです。以下のような 何か作業をする必要があります:あなた `lambda`sがそれぞれoperator.or_`と` operator.and_`、 `に置き換えることができ

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

注意を。 – Dougal

+0

+1、それを指摘してくれてありがとう –

+0

私たちがいる間、priority_filters = [Q(focus_priority = p_id)for p_id for priority_ids] ':) – Dougal

関連する問題