LoginSignup
2
4

More than 3 years have passed since last update.

Djangoのfilterまとめ

Last updated at Posted at 2020-04-12

先日Djangoで開発をしていて、検索機能が必要になりました。
ただ、いつも「あれ、絞り込みの書き方なんだっけ?」となるのでまとめてみました。
追記や間違っている箇所などあれば、ご指摘いただけると幸いです。

構成

  • 概要
  • 厳しめ検索
  • ゆるめ検索
  • 大文字小文字を区別しない

概要:Djangoのfilter

Djangoのモデルには、objectという属性があり、この中にManagerクラスのインスタンスが入っています。
filterとは、このManagerクラスに用意されている機能で、文字通り欲しいデータをフィルター(絞り込む)際に便利な機能です。

厳しめ検索

厳しめ検索と名付けてしまいましたが、これから紹介するのはFilterしたい内容に完全に一致するものを絞り込む検索です。

この検索では、大文字と小文字も区別して完全一致で検索されます。

user_name = "hoge" //探したいユーザー名を変数としておきます。
data = User.objects.filter(name=user_name)

Userモデル内のnameフィールドが上で定義したuser_nameと一致するものを取得します。
こうすることで、hogeという名前に完全に一致するものだけに絞り込むことができます。

ゆるめ検索

では次にゆるめの検索についてみていきましょう。
「hogeなんて名前に完全一致するやついるかわかんないじゃん、でも、hogefugafooっていうめちゃくちゃプログラマーみたいな名前の人ならいるかもじゃん」っていう時、よくありますよね。

そんな時に、"hoge"に完全一致する物だけじゃなく、"hoge"を含む検索がしたいというときに、使うのが、このゆるめな検索です。

ゆるめ検索の書き方

  • を含む検索
    フィールド名__contains=値
  • で始まる検索
    フィールド名__startswith=値
  • で終わる検索
    フィールド名__endswith=値

です。

具体的な使い方をみていきましょう。

含む検索

user_name = "fuga"
data = User.objects.filter(name__contains=user_name)

これで、"hogefugafoo"さんも取得することができました。
そのほかの検索も同様です。

で始まる検索

user_name = "fuga"
data = User.objects.filter(name__startswith=user_name)

この場合は、"fuga"で始まるなので、"hogefugafoo"さんは一致しませんが、"fuga太郎"さんは一致します。

で終わる検索

user_name = "fuga"
data = User.objects.filter(name__endswith=user_name)

この場合は、"hogefugafoo"さんは一致しませんが、"山田johnfuga"さんは一致します。

大文字小文字を区別しない

さて、ここまでくると、大文字と小文字の区別をしないなんていうさらにゆるーい検索がしたいこともあるでしょう。
そんな時は、iをつけるだけです。

大文字小文字を区別しない書き方

  • 大文字小文字を区別しない厳しめだけどゆるめな検索
    フィールド名__iexact=値
  • 大文字小文字を区別しない、かつゆるめなゆるゆる検索

    • 含む検索
      フィールド名__icontains=値
    • で始まる検索
      フィールド名__istartswith=値
    • で終わる検索
      フィールド名__iendswith=値

最後まで読んでいただきありがとうございました。
後日、数値検索や複数条件でのAND検索OR検索について書いていきますので、どうぞよろしくお願いします。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4