2017-10-23 9 views
0

リスト内の単語に一致する結果のリストを検索したいと思います。同社は、異なる入力を持っている場合、例えばdjangoのリストにある単語の検索結果

それはまだそれらを見つけることができます:

company_name = 'awesome blossom' 

私は「素晴らしい」と名前に「花」が企業を検索したいと思います。

私はこのような何か試してみました:

companies = Company.objects.filter(company_name__icontains__in=company_name.split(' ') 

をが、これは動作しませんでした。

どうすればこの問題を解決できますか?

答えて

1

おそらく、このような文は動作します:

Company.objects.filter(reduce(and_, [Q(company_name__icontains=s) for s in company_name.split(' ')])) 
+0

'reduce'はPython 3のデフォルトネームスペースにありません。 –

+0

functools import reduce? –

0

私は名前に '素晴らしい' '花' を持つ企業を検索したいと思います。

リスト内の各要素に対して1つの条件でクエリを作成する必要があります。見積もりに記載されているとおり、これらの条件はANDedである必要があります。

あなたはこのように、複数のフィルタを追加することによってこれを行うことができます:Djangoは十分にスマートであるように、これは、データベースへの単一のクエリを生じるはずである

companies = Company.objects.all() 
for word in company_name.split(): 
    companies = companies.filter(company_name__icontains=word) 

これを行うためのさらに詳しい方法は、Qオブジェクトとreduce機能を使用することです。

from django.db.models import Q 
from functools import reduce 

Company.objects.filter(reduce(Q.__and__, [Q(company_name__icontains=word) for word in company_name.split()])) 

この例では、両方のクエリが同等である必要があります。

+0

'Q個のオブジェクト 'を' '減らさないと、OPにははるかに明確になるでしょう。これは、「条件1」* AND *「条件2」* OR *「条件3」のような状況がある場合にも役立ちません。したがって、それらを明示的に書き出し、論理演算子を使用してそれらを接続する方がはるかに意味があります。 –

+0

"素晴らしい"と "花"という言葉は単なる例です。おそらくこれらの言葉はユーザーの入力から来るでしょう。この場合、言葉の量が変わる可能性があります。そのため、動的なやり方で行う必要があります。 –

関連する問題