【Django(初学者向け)】QuerySetの取得 filterメソッドについて

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

(最終更新月:2021年5月)

データベースからデータ取得の際に

「objects.get()」getメソッドでエラーが出てしまう

単一のデータでなく、QuerySetを取得したい

というDjango初学者の方へ向けた記事となります

当記事を通じて、

  • objects.filter()」filterメソッドについての基本・特長

を解説していきます

ポイントとしては、下記の通りです

今日のポイント!
filterメソッドは、
  • オブジェクトが一つだとしてもQuerySetを返す
  • オブジェクトが存在しない場合、空のオブジェクトを返す
  • 完全一致だけでなく、部分一致でのデータ抽出も可能

今回の解説にあたり使用するモデルクラスについては、こちらをご覧ください(日報アプリの”NippoModel”を使います)

早速みていきましょう!

筆者プロフィール

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

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

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

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

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

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

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

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

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

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

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

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

QuerySetを返す

fileterメソッドとは、QuerySetを返すメソッドです

q = NippoModel.objects.filter(pk=pk)
print(q)

print()でみてみます

対象のオブジェクトが一つの時

print()の結果

<QuerySet [<NippoModel: title1>]>

QuerySetが返ってますね

getメソッドのときは?

q = NippoModel.objects.get(pk=pk)
print(q)

[OUTPUT]

title1

単一のオブジェクトが返ってきます!

対象のオブジェクトが存在しない場合はどうなるのでしょうか?

対象のオブジェクトが存在しない時

print()の結果

<QuerySet []>

空のQuerySetがprintされました

getメソッドでは?

エラーが出てきてしまいます

filterを使うとエラーになりませんので、エラーを回避するための方法にもなります

ただし、回避方法についてはfilterを使う以外にもありますので、別記事にて詳しくご紹介します

部分一致等でQuerySetを取り出す(Field Lookups)

いくつもありますので、詳しくはこちら(公式ドキュメント)をご覧ください

必要最小限、よく使うものをご紹介します

<フィールド名>__<Field Lookup> = "条件"

で検索します

__はアンダバー2つになります!

icontains

部分一致でオブジェクトを取り出します

q_icontains = NippoModel.objects.filter(tittle__icontains="test")

titleフィールド内に”test”という文字を含むものを抽出しています

※”contains”も同じように使えますが英字での大文字小文字で区別がされます

大文字小文字で区別をせずにデータを抽出する場合は、”icontains”を使いましょう!

in

リスト内の要素のうち一つでも等しい値があれば対象となります

q_in = NippoModel.objects.filter(pk__in=[1, 3, 5])

プライマリーキー(pk)が1,3,5のオブジェクトが抽出されます

gt / gte / lt / lte

  • gt “条件”より大きい greater than
  • gte “条件”より大きい、もしくは等しい greater than or equal to
  • lt “条件”より小さい less than
  • lte “条件”より小さい、もしくは等しい less than or equal to

英語で覚えると、覚えやすいですね!

greater than は gt

テンプレート側での注意点

filterメソッドが返すのはQuerySet(リスト)なので、もし対象のオブジェクトがひとつだったとしても、

テンプレート内でforループを使う

などとリスト型として扱うことを忘れないようにしましょう!

まとめ

filterについては、

  • QuerySetを返すメソッドであること
  • 部分一致等のオブジェクトを取り出す方法

をおさえて先に進みましょう!

HTMLテンプレート内でオブジェクトを取り出すときは、返り値がリスト(QuerySet)だということを忘れずに!

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