先日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検索について書いていきますので、どうぞよろしくお願いします。