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

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

    番号 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の効率的なスキルアップに、
       是非お役立て下さい。