2016-08-08 7 views
0

基本的なクエリ検索を行いたい。フィールドcityareaを使用して、データベースの参照を実行したいとします。Qを使用したDjangoクエリ参照正しい結果を返さない

ユーザーが検索フィールドに市区町村を入力すると結果が返されます。また、ユーザーが都市またはエリアを入力した場合は、結果を返す必要があります。

検索フィールドに市区町村を入力すると、次のコードが返されず、データベースに保存されたクエリに関連するオブジェクトがあります。代わりに '結果なし'を返します。

def my_search(request): 
    try: 
     q= request.GET['q'] 
     hots= Place.objects.filter(Q(city__icontains=q)&Q(area__icontains=q)) 
     c_hos=hots.count() 
     return render(request, 'search/own_search.html',{'hots':hots, 'q':q, 'c_hos':c_hos}) 
    except KeyError: 
     return render(request, 'search/own_search.html') 

は私も|を使用してみました、それがどんな結果を返さないときI入力フィールドで一緒に都市と地域。

私には何が欠けていますか?フィルタの一般的なすべてのkwargsから()で

+2

この 'Q(city__icontains = q)&Q(area__icontains = q)'は 'Q(city__icontains = q)&& Q(area__icontains = q)'でなければなりません。これはあなたの質問がうまくいかないところです。 –

+0

構文が無効です! – YoYo

答えて

1

が一緒にAND演算されます。また、問題なく動作するはずDjango Documentation

# For performing OR operation 
hots= Place.objects.filter(Q(city__icontains=q) | Q(area__icontains=q)) 

# For performing AND operation 
hots= Place.objects.filter(Q(city__icontains=q), Q(area__icontains=q)) 

にQを使用して、複雑なルックアップについての詳細を知ることができます。

EDIT:

要求から変数「Q」は、単一の変数に都市と地域の両方が含まれている場合は、使用しているロジックが適切ではないので、これは何も返さ文句を言いません。

あなたのq =「カリフォルニア州サンフランシスコ」で、その後、全体のクエリが何も一致しない場合は、テーブル

State    City 
California   San Francisco 

を想定。その結果、この

q = "San" # Or q = "Franscisco" 
result = Place.objects.filter(Q(state__icontains=q) | Q(city_icontains=q)) 

のようなもので

__icontains作品は、状態=カリフォルニア州、市=サンフランシスコでオブジェクトを持つことになります。

同じロジックを使用するのは簡単ですが、都市や場所を入力して作業するのは簡単です。はるかに簡単です。

再編集:

あなたはこれを使用して試すことができます文字列内のすべての単語をフィルタリングする場合:

list = str(q).split() 
result = Place.objects.filter(reduce(operator.and_, (Q(place__contains=x) | Q(city__contains=x) for x in list))) 
# Adding .distinct() to the filter might clean the QuerySet and remove duplication in this scenario. 
+0

が動作しません..結果を返しません。 – YoYo

+0

私は自分の投稿を編集しました。私はあなたが以前に達成したいことを理解していませんでした。クエリ用語と、クエリから期待していたレコードの両方を送信できる場合に役立ちます。 – kt14

+0

あなたは私がしようとしていることを説明しました。問題は、同時にキーワードでデータをフィルタリングする方法です。 |を使う「サンフランシスコ」または「カリフォルニア」のみを行います。それは一度ですべてを行うことはありません。多分分割はしますか?はいの場合、どのようにキーワードを分割するのですか? – YoYo

1

あなたがまたはオペレータで行くべき「|」あなただけの都市またはエリアのみのクエリを受け入れる場合。私は、変数qを要求から取り出した後に印刷して、何が入っているのかを確認し、再度データベースクエリを実行することをお勧めします。もう一つの考えは、qの価値を都市と地域に分けるべきではないかと思います。

+0

あなたは正しいと思います。問題は今、キーワードをどのように分割するのかです。 – YoYo

関連する問題