djangoでモデルの中のデータを検索する場合などは、filterについて知っておくことが大切です。
そこで今回は、filterの具体的な使い方や、その仕組みについて分かりやすく解説していきます。
modelとフィルターの関係
まず、modelとフィルターの関係について具体的なコードをみながら理解を深めていきましょう。
まず、以下のコードをみてみましょう。このコードは、モデルに入っているすべてのデータをquerysetとして取り出しています。
コードsome_queryset = Model.objects.all()
このデータに対し、中身の絞り込みを行うために使われるのがfilterです。
以下の2つのコードは同じ意味を持つということを頭に入れておくと、理解が深まるかもしれません。
コード1 queryset = Model.objects.all.filter(title__startswith=1)
2 queryset = Model.objects.filter(title__startswith=1)
1行目で書いたallは省略されることが多いですのでイメージがわきづらいですが、この1行目のコードを見ると、filterというのはモデルに入ったデータを絞り込むために使われる、ということのイメージがわくのではないかと思います。
filterはquerysetを返す
次におさえておきたいことは、filterメソッドが返すデータはqueryset型ということです。
なお、querysetについてはquerysetについて分かりやすく解説【具体例で説明します】という記事で詳しく説明していますので、参考にしてください。
なお、Model.objects.all()データもqueryset型です。
つまり、filterは全てのデータから条件に合わせてデータを絞り込み、それをquerysetというリストのような形にして返しているのです。
filterの使い方
ここからは、filterの具体的な使い方についてみていきましょう。
最低限の設定は初期設定コードに書いていますので、その記事を参考にしてください。
コード-BASE/app/models.py
class FileterModel(models.Model):
title = models.CharField(max_length=50)
content = models.TextField()
管理画面で以下のデータを作っていることを前提に進めていきます。
番号 | title | content |
1 | 1234 | 1つ目の記事です |
2 | 5678 | 2つ目の記事です |
3 | 1111 | 3つ目の記事です |
4 | 2222 | 4つ目の記事です |
コード-BASE/app/views.py
def filterfbv(request):
a = NewModel.objects.filter(title__startswith=1)
print(a)
return HttpResponse('')
a = NewModel.objects.filter(title__startswith=1)
というコードの右側のかっこに注目していきましょう。
title__startswithという記載からです。
これは、NewModelの中のtitleフィールドから、〇〇ではじまるデータを抽出するという意味です。
今回はtitle__startswith=1としていますので、1ではじまるtitleのデータがquerysetとして返されます。
実際の出力結果を確認してみましょう。
コマンドライン<QuerySet [<NewModel: 1234>, <NewModel: 1111>]>
titleが「1」から始まっている2つのデータを取ることができました。
このように、(フィールド名__filterの条件=' ')という形でfilterを使っていくということを頭に入れておきましょう。
filterで使える条件
次に、filterで使える主な条件についてみていきましょう。
言葉 | 条件 |
exact | 完全一致(大文字小文字の区別あり) |
iexact | 完全一致(大文字小文字の区別なし) |
contains, icontains | 部分一致 |
startswith, istartswith | 始めに一致 |
endswith, iendswith | 終わりに一致 |
gt | 超 |
gte | 以上 |
lt | 未満 |
lte | 以下 |
filterは重ねて使うことができる
また、filterは重ねて使うことができるということも意識しておきましょう。
filterを重ねた場合は、and検索をするようなイメージになります。
or検索をしたい場合は、qオブジェクトを使う必要があります。詳細については、Qオブジェクトの使い方を解説【具体的なコード付き】という記事を参考にしてください。
実際にfilterを重ねたコードと、その出力結果を見てみましょう。
コードdef filterfbv(request):
a = NewModel.objects.filter(title__startswith=1).filter(title__endswith=1)
print(a)
return HttpResponse('')
コマンドライン<QuerySet [<NewModel: 1111>]>
1ではじまり1で終わるデータですので、1つのデータだけ取得することができました。
filterのまとめ
(1) モデルのデータを絞り込むために使われる。
(2) 返されるデータ型はqueryset
(3) filterを重ねて使うことも可能。その場合はand検索のようなイメージになる。
~Django無料講義~のご案内
Code for Djangoが、4時間超の無料Django講義をはじめました
- ・本を出版したCode for Djangoの 製作者が作ったサイトです。
- ・Code for Djangoの内容も、 動画で詳しく解説しています。
- ・動画は順次ふやしていきますので、 ただで学び続けることが可能です。
- ・Djangoの効率的なスキルアップに、 是非お役立て下さい。