2011-10-17 2 views
1

私のサイトでレストランを探すときにユーザーが検索したいと思うフィールドがいくつかあります。 (m2m)、neighborhoods(m2m)およびevent_space(m2m)である。Djangoのいくつかのフィールドを検索します。それらをチェーンする方法がわからない

これらはドロップダウンボックスとしてユーザーに表示されます。また、ユーザーが何でも入力できるテキストフィールドを提供し、レストランname(CharField)とkeywords(CharField)を検索することもできます。

私は、適用されたこれらのフィルタの1つの結果を表示するためのビューを作成できますが、それらのすべてではありません。ああ、それぞれのドロップダウンは明らかにnull /空のデフォルトを持つでしょう。

アイデア?ここから始めてください:

from django.db.models import Q 
if request.GET.get('q'): 
    search_terms = request.GET.get('q') 
    restaurant_list = Restaurant.objects.filter(
     Q(name__icontains=search_terms) | 
     Q(keywords__icontains=search_terms) | 
    ).order_by('-user__date_joined') 

しかし、それは1つのフィールドだけをカバーしています。すべてのドロップダウンはどうですか?

ああ(!)私はすべてのGETパラメータをコンパイルし、それらを分割してリストにダンプすることができますが、すべての値がシングルワードではないと思います。

私はHaystackにもオープンしていますが、わかりません。あなたはposteds値とQ(サンプルに適量の名前)のリストを準備することができますポストとフィールドモデルフォームで

+0

「すべて」は「and」を意味しますか?料理のスタイルと近所とイベントスペース?それが "and"を意味するなら、それは自動的です。もしそれがORなら、あなたは何らかの仕事をしなければならない。どのような具体的なロジックを実装しようとしていますか? –

+0

POSTメソッドに移行することをお勧めします。あなたはドロップダウンリストについて話しています。これは多くの文字かもしれません。 – danihp

+0

私のロジックはCuisine style AND Neighborhood AND Event Spaceです。 – Flowpoke

答えて

3

from django.db.models import Q 
if request.method == 'POST': 

    qs = [] 
    if form.is_valid(): 
     cuisine_styles = form.cleaned_data['cuisine_style'] 
     neighborhoods = form.cleaned_data['neighborhoods'] 
     search_terms = form.cleaned_data['search_terms'] 

     if cuisine_styles: qs.append(Q(cuisine_style__in = cuisine_styles)) 
     if neighborhoods: qs.append(Q(neighborhoods__in = neighborhoods)) 
     for s in search_terms.split(' '): 
      qs.append( Q(name__icontains=s)) 
      qs.append( Q(keywords__icontains=s)) 

     f = None 
     for q in qs: 
      if f is None: f = q 
      else: f |=q 

     restaurant_list = Restaurant.objects.filter(f).order_by('-user__date_joined') 
     #show results .... 
else: 
    #show form .... 

私はあなたのドロップダウンボックスがModelMultipleChoiceFieldであることを前提としています。

+0

Hrm、Imフォームセットを使用していません。私は単純に各フィールドのdictを渡し、ドロップダウンを構築するためにテンプレート内でループします。おそらくこれが再設計を検討すべき場所です。私の現在の「ドロップダウン」は、複数選択ではなく、単一選択です。ほとんどの場合、このデータセットで倍数を選択する可能性は高いですが、それは過度に設計されたものとみなされます。私のより一般的な実装に関するアイデアですか? – Flowpoke

+0

| = q?私はその部分を得ることを確認していない。 – Flowpoke

+0

f | = qは、f = f | q。すべての条件で大きなORを作成するだけです。名前とキーワードでORを作成し、他のフィールドとANDをとるようにクエリを絞り込むことができます。 – danihp

関連する問題