0

13個のチェックボックスのグループが一緒に検索条件を構成するフォームがあります...ALLまたはANYのラジオボタンのペアも追加したことを除いて。

私は次のようなエレガントなもので逃げることを望んでいました:

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)

ただし、any()とall()はブール値を返しますが、フィルターで使用できるクエリセットは返しません。「Q(...)| Q(...)| Q(...)」または「Q(...)&Q(..」と同等の「any」または「all」が必要です。 。)&Q(...)"1から13の基準まで。

4

2 に答える 2

2

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))
于 2012-04-05T22:56:00.307 に答える
0

以下のようにQ()で動的にクエリを実行できます...

from django.db.models import Q 
from priority_app.models import Priority  # get your model identified


#(whatever API place you had this):

    priority_id = request.GET.get("priority")   #getlist is isn't a proper list
    field_id = request.query_params.get('collection')
    if priority_id:
        priority_id_list = list(map(str.strip, priority_id.split(",")))


        dynamic_query_filters = Priority.objects.none()
        for a_item in priority_id_list:
            if collection == "any":
                dynamic_query_filters |= (Q(id=a_item))    # OR query
            else:
                dynamic_query_filters &= (Q(id=a_item))   # AND query
    
        queryset = Priority.objects.filter(dynamic_query_filters)   
        # you will notice, it executes in order of "query", maybe take them in different variables and chain them accordingly.
       
 
于 2021-01-14T17:27:58.730 に答える