LoginSignup
3
2

More than 3 years have passed since last update.

Django 検索機能まとめ

Posted at

検索方法

基本的には、モデル名.objects.filter()を使う。
filter()の引数を変えることで様々な検索ができる

基本の検索

検索対象のカラム名をcolumnとする

以下、検索のキーワードをword

引数 意味
column=word 一致するもの
column__iexact=word 大文字小文字区別なしの一致するもの
column__contaiins=word あいまい検索
column__startwith=word wordで始まるもの
column__endwith=word wordで終わるもの
column__icontaiins=word 大文字小文字区別なしのあいまい検索
column__istartwith=word 大文字小文字区別なしのwordで始まるもの
column__iendwith=word 大文字小文字区別なしのwordで終わるもの

以下、検索の値をnum

引数 意味
column=num 一致
column__gt=num numより大きい
column__gte=num numと等しいか大きい
column__lt=num numより小さい
column__lte=num numと等しいか小さい

複数条件の検索

条件全てを満たす

いくつかの条件を全て満たすものを検索する場合、単純に引数を複数記述すれば良い
('論理積', 'AND検索', 'かつ'と言われるものになる)
「num1以上num2以下」は次のようになる。

sample.py
filter(column__gte=num1, column__lte=num2)

条件が増えてきたときは次のような記述もできる。

sample.py
objects.filter(条件1) \
.filter(条件2)\
.filter(条件3)\
.filter(条件4)

条件のどれかを満たす

2つの条件のどちらかを満たしているものを見つけたいときは
Q関数の引数に条件を指定して|でつなげてfilterの引数にする。
('論理和', 'OR検索', 'または'と言われるものになる)

sample.py
from django.db.models import Q

objects.filter( Q(条件1) | Q(条件2) )

検索wordがいくつかある場合はQ関数をつなげるよりも、リストによる検索が便利。
word1 or word2 or word3 といった検索の時は、
objects.filter(column__in = [word1, word2, word3])のようにする。
実際には、以下のようにフォームに入力されたものをlistに変換するなどして使う。

sample.py
find = request.POST['find']
list = find.split()
data = Friend.objects.filter(name__in=list)

これは半角スペース区切りで入力された名前全てで検索する例

参考

Python Django3超入門

3
2
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
3
2