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

※本サイトにはプロモーション・広告が含まれています。

(更新月:2021年6月)

「Djangoで検索フォームを作りたい!」

「Qオブジェクトってどうやって使うの?」

という方へ向けた、

Qオブジェクトの基本、使い方

を解説していきます

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

なぜ、検索フォームで使えるの??

ズバリ、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をコピーしました