Life is Like a Boat

忘備録や投資日記、プログラミングに関するメモやtipsなど

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学習にオススメの書↓

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《実践編》

現場で使える Django の教科書《実践編》