:検索
- FIRST_NAME "トーマス"
- LAST_NAME "スミス"
- FIRST_NAME LAST_NAME "トーマス・スミス"
私はこれらの用語でクライアント "トーマス"を見つけるクエリーセットを作成しようとしていますが、結果を "thomas"ではなく "thomas smith"に限定しますas jones "または" george smith "の両方の名前が指定されている場合
私はフィルター、Qオブジェクト、文字列分割、およびこれを達成するためのループを使用する方法について多くの研究を行ってきましたが、これまでのところ運がありません。
MODEL:
class Client(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
VIEW:
def search(request):
query = request.GET.get('s', '').strip()
if query:
client_set = (
(Q(first_name__in=query) & Q(last_name__in=query)) |
Q(first_name__icontains=query) |
Q(last_name__icontains=query)
)
else:
client_list = []
return render_to_response("search.html", {
"client_list": client_list,
"query": query
},context_instance=RequestContext(request))
上記のコードは "thom"を検索するときに機能しますが、 "thomas smith"には何も見つかりません。記述したようにこれをどのように書き直すことができますか?
何らかの特定の理由は、あなたの代わりに 'first_name__icontains'のfirst_name__in''使用している理由はありますか?あなたは '__in'が期待どおりに動作しないと確信しています;) – Wolph
私も__icontainsで試してみました。 __inの私の理解は、SQLレベルでLIKEに変換する必要があるということです。私のSQLが錆びている間、私はそれが検索クエリの任意の部分を取ってフィールド値にマッチさせることを意味し、 "thomas smith"はファーストネームの "thomas"に、そして "smith"はlast_name。そのように動作した場合、私のクエリはうまくいくと思います。明らかにそうではありません。 :-) – Antientropic
'__contains'演算子は' LIKE'に変換され、 '__icontains'は' ILIKE'に変換されます。 '__in'は通常プライマリキーのルックアップに使用され、' id IN(...) 'のようなものに変換されます – Wolph