2010-12-20 17 views
3

私は検索フォームを作成する私のdjangoアプリケーションで単一のモデルを持っています。モデル内のすべてのフィールドを同じ検索文字列で一度に検索する方法はありますか?私はxapianとsolrを調べましたが、1つのモデルを検索するためのオーバーヘッドのように思えます。私のような何かを言うことができるようにしたい:サードパーティのアプリケーションなしでdjangoモデルの複数のフィールドを検索

results = Assignment.objects.filter(any_column = search_string) 

私は簡潔な何かではないかもしれません実現が、今の検索アプリを使用するよりも、私は他を考え出すことができる唯一のオプションは個別に各フィールドをチェックすることで、結果を連結します。

+0

:両方のフィールドに対して照会する、SearchVectorを使用します。 –

+0

2つのフィールドで簡単な例を表示できますか?私はdjangoのドキュメントでreduce()関数を探してみましたが、見つけられませんでした。 –

答えて

12

あなたがkwarg expansionを使用してQ objectsを作成し、単一のクエリにそれらを回すためにoperator.or_とともにreduce()を使用することができ、すべてのfield namesを持っていたら。

qgroup = reduce(operator.or_, (Q(**{fieldname: value}) for fieldname in fieldnames)) 
asgns = Assignment.objects.filter(qgroup) 
+1

Q(...)オブジェクトの周りに括弧を追加する必要がありましたが、そうでなければ魅力的でした!ありがとうございました。このようなものがdjangoのショートカットに作られていない理由はありますか?私の初期の例のような構文を持つようなシンプルなモデルを検索することは、素晴らしいツールになるでしょうか? –

+0

Dunno。おそらく、Pythonを使うのは簡単ではないからです。 –

+0

こうすると、フィールド名のfieldnameの 'qgroup = reduce(operator.or_、Q(** {fieldname:value})'はdjangoプログラマの場合は 'Assignment.objects.filter(any_column = somestring ') 'はAPIの一部ですか?面白い...私はそれがジャンゴ側に実装することは自明ではないかもしれないが、私はそれがモデルを検索するための一般的な使用法だと思う。 –

0

古い質問が、さらに参考のために私はこれを追加してい:ジャンゴで

1.10 SearchVectorクラスが追加されました。ドキュメントから

使用法:

つのフィールドに対する検索は素晴らしいですが、むしろ制限します。検索しているEntryインスタンスは、タグラインフィールドを持つブログに属しています。 `operator.or_`と` Q`オブジェクトとkwarg拡張と `)`(減らす

>>> from django.contrib.postgres.search import SearchVector 
>>> Entry.objects.annotate(
...  search=SearchVector('body_text', 'blog__tagline'), 
...).filter(search='Cheese') 
[<Entry: Cheese on Toast recipes>, <Entry: Pizza Recipes>] 
関連する問題