DjangoでOR検索したい時
Djangoを使ったWebアプリでOR検索したいシーンがあると思います。
例えば店の紹介文からアイスクリーム屋かケーキ屋、たこ焼き屋、etc...を検索したい時、SQLだとこんな感じでWHERE句を作ると思います。
WHERE (description LIKE %アイスクリーム% OR description LIKE %ケーキ% OR description LIKE %たこ焼き%))
DjangoではQ objectを使うやり方で、下記のようになります。
cafeList = Cafe.objects.filter(Q(description__contains = "アイスクリーム") or Q(description__contains = "ケーキ") or Q(description__contains = "たこ焼き"))
Q objectを連結させていくイメージなのですが、Q objectの数が動的に変わる場合はどうするのでしょうか。先日参加したDjangoのもくもく会でakiyokoさんに教えてもらったのが、下記のようなやり方です。
検索フォームから"アイスクリーム ケーキ たこ焼き "
keywords = ["アイスクリーム", "ケーキ", "たこ焼き"] for keyword in keywords: # 'or' the Q objects together q_objects |= Q(description__contains=keyword)
パイプとイコールサインを組み合わせるシンタックスって初めてみたんですが、こうするそうです!
python - How to dynamically compose an OR query filter in Django? - Stack Overflow
Django学習にオススメの書↓
- 作者: 横瀬明仁
- 出版社/メーカー: NextPublishing Authors Press
- 発売日: 2018/08/26
- メディア: オンデマンド (ペーパーバック)
- この商品を含むブログを見る
- 作者: 横瀬明仁
- 発売日: 2018/12/08
- メディア: Kindle版
- この商品を含むブログを見る