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

Django

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

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

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

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

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

当記事を通じて、

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

を解説していきます

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

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

今回の解説にあたり使用するモデルクラスについては、こちらをご覧ください(日報アプリの”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

  • 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)だということを忘れずに!

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!
タイトルとURLをコピーしました