(最終更新月:2021年5月)
データベースからデータ取得の際に
「objects.get()」getメソッドでエラーが出てしまう
単一のデータでなく、QuerySetを取得したい
というDjango初学者の方へ向けた記事となります
当記事を通じて、
- 「objects.filter()」filterメソッドについての基本・特長
を解説していきます
ポイントとしては、下記の通りです
今回の解説にあたり使用するモデルクラスについては、こちらをご覧ください(日報アプリの”NippoModel”を使います)
早速みていきましょう!
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)だということを忘れずに!