modelにfilterをかけてデータを絞り込む方法【コードを沢山集めました】

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()

管理画面で以下のデータを作っていることを前提に進めていきます。]

[コード]

-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で使える主な条件についてみていきましょう。
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の効率的なスキルアップに、
 是非お役立て下さい。

                                                                 Django講義はこちら
Created with