(最終更新月:2021年5月)
データベースからデータ取得の際に
「objects.get()」getメソッドでエラーが出てしまう
単一のデータでなく、QuerySetを取得したい
というDjango初学者の方へ向けた記事となります
当記事を通じて、
- 「objects.filter()」filterメソッドについての基本・特長
を解説していきます
ポイントとしては、下記の通りです
今回の解説にあたり使用するモデルクラスについては、こちらをご覧ください(日報アプリの”NippoModel”を使います)
早速みていきましょう!
✔初期費用ゼロ/月9,800円でWebデザインが学べる
デザインを習得するためには、客観的なフィードバックと改善が不可欠です。
以下の記事ではこんなWebデザインスクールをご紹介しています。
- 初期費用ゼロで、月々9,800円のみ
- オンラインで、教材が使い放題
- コンテストや実務案件にチャレンジして報酬もGETできる
デザナルはトップデザイナーからレビューがもらえる、格安の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

英語で覚えると、覚えやすいですね!
greater than は gt 等
テンプレート側での注意点
filterメソッドが返すのはQuerySet(リスト)なので、もし対象のオブジェクトがひとつだったとしても、
テンプレート内でforループを使う
などとリスト型として扱うことを忘れないようにしましょう!
まとめ
filterについては、
- QuerySetを返すメソッドであること
- 部分一致等のオブジェクトを取り出す方法
をおさえて先に進みましょう!

HTMLテンプレート内でオブジェクトを取り出すときは、返り値がリスト(QuerySet)だということを忘れずに!
当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています
「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」
という方は必見です!
