0

「大きなファイルの大きな机」という検索用語がある場合、1)結果のいずれかをどのように検索しますか。2)すべての結果。

私が現在行っている検索は次のとおりです。

results = Path.objects.filter(path__icontains=search)

私がする必要があるのは、次のようなものです。

results = Path.objects.filter(path__icontains=search.split())

これらの両方をどのように行いますか?(またはまたはAND)

4

3 に答える 3

3
from django.db.models import Q
from operator import or_

# AND - use argument unpacking
Path.objects.filter(*(Q(path__icontains=s)
                      for s in search.split()))

# OR - use reduce
Path.objects.filter(reduce(or_, (Q(path__icontains=s)
                                 for s in search.split())))
于 2013-01-26T02:23:01.787 に答える
1

最初に知っておく必要があるのは、フィルタリング時に実際にデータベースにアクセスしていないことです。そのため、パフォーマンスを大幅に低下させることなく、フィルタリングを複数回実行できます。最初のアプローチは次のとおりです。

results = Path.objects.all()
for s in search.split():
    results = results.filter(path__icontains = s)

これはANDの場合であり、またはの場合と同様のアプローチを使用できます。

于 2013-01-25T01:23:04.860 に答える
0

リスト内包表記を作成し、reduce関数を使用します。

keywords = search.strip().split()
list_path_qs = [Q(path__icontains=x) for x in keywords]
final_q = reduce(operator.and_, list_path_qs)
results = Path.objects.filter(final_q)[:100]
于 2013-01-25T01:19:53.860 に答える