(更新月:2021年6月)
「Djangoで検索フォームを作りたい!」
「Qオブジェクトってどうやって使うの?」
という方へ向けた、
Qオブジェクトの基本、使い方
を解説していきます
なぜ、検索フォームで使えるの??
ズバリ、Qオブジェクトを使うと、
or検索による新たなQuerySetの作成
が容易にできます
例えば、下↓の記事でご紹介している日報アプリでは、title, content, slugというフィールドが用意されているモデルがあります
Qオブジェクトを使い、検索したワードがtitle, content, slugのいずれかに含まれているデータのみで構成されたQuerySetを返します
まずは.pyファイルの上部でQをインポートした上で、下記へ進んでいきましょう!
from django.db.models import Q
Qはfilterと一緒に使う
Qオブジェクトを一つのかたまり(q_obj)とした時に、構造はこんな形になります
qs = NippoModel.objects.all()
new_qs = qs.filter(q_obj)
見ての通り、new_qsがQオブジェクトを使ったQuerySetになります
Qオブジェクトの構造
上記のq_objの中身を見てみましょう
q_obj = (Q(title__icontains=query)|
Q(content__icontains=query)|
Q(slug__icontains=query)
)
※queryは検索フォームに入力した文字列になります
見ての通り、q_objは複数のQオブジェクトのかたまりです
Qオブジェクト単体の構造と連結方法をそれぞれ見ていきましょう
Qオブジェクトを紐解く
一つ抜き出してみると
Q(title__icontains=query)
となります
つまり、
Q(フィールド名__icontains=検索したいワード)
でQオブジェクトが作成できます
わかりにくいけど、
__はダブルアンダースコア
(アンダースコア2つ)
になりますのでご注意を!
icontainsは大文字小文字関係なく検索した文字列を含むデータを探します
用途によって下記の通りicontainsを他のものに置き換えることも可能です
contains | 含まれているかどうか |
exact | 完全一致しているかどうか |
startswith | 始めと一致しているかどうか |
endswith | 終わりと一致しているかどうか |
gte | 以上(Greater Than or Equal) |
lte | 以下(Less Than or Equal) |
上記のものに「i」をつけると大文字小文字の区別がなくなります
連結方法
連結する方法はor検索の場合、
|
でつなぎます
※私の使っているLinuxでは、shift+右上の¥マークを押すと|が出てきます
コード例
検索フォームの作成方法について↓こちらの記事に詳しく記載されています
Qを使用した部分だけ抜粋すると下記の通りです
Qをインポート
from django.db.models import Q
Qを実際に使いQuerySetを取り出す
or_lookup = (Q(title__icontains=query)|
Q(content__icontains=query)|
Q(slug__icontains=query)
)
qs = qs.filter(or_lookup)
部分的な抜粋ですが、or_lookupとしてQオブジェクトを使用しています
「全体のコードを見てみたい!」という方はこちら↓をご覧ください
最後までご覧頂きありがとうございました!!!