【Django(初学者向け)】Qオブジェクトの基本、使い方について

Django

(更新月: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オブジェクトを使用しています

「全体のコードを見てみたい!」という方はこちら↓をご覧ください

☆検索フォーム Search Form を追加しよう!☆

最後までご覧頂きありがとうございました!!!

タイトルとURLをコピーしました