さまざまな検索 (4/4)
作成:2018-01-14 09:05
更新:2018-01-14 09:05
更新:2018-01-14 09:05
■リストの項目を検索する
ここまで検索は、用意されたテキストや数値をテーブル内に記録されている値と較べて絞り込む、というものでした。検索する対象となる値は、常に1つだけでした。
が、「複数の値を用意して検索する」という場合もあります。「○○の値が、AかBかCのものを検索」というようなやり方ですね。まぁ、これもORを使って条件を3つつなぎ合わせればできますが、正直ちょっと面倒くさい。それに、候補となる値が3つならいいんですが、これが100ぐらいになったりするとかなり大変です。
こうした場合のために、Djangoには「値をリストにまとめて検索する」という機能が用意されています。
■リストに含まれるものを検索
では、これも利用例を挙げておきましょう。index関数を下のリスト欄のように書き換えて下さい。
これは、「カンマで区切った名前をすべて検索」するものです。例えば、入力フィールドに「taro, hanako, sachiko」と記入すれば、nameの値がtaroまたはhanakoまたはsachikoのいずれかの項目をすべて取り出します。
ここでは、送信されたテキストを変数に取り出した後、splitを使い、カンマでテキストを分割してリストを作成しています。
が、「複数の値を用意して検索する」という場合もあります。「○○の値が、AかBかCのものを検索」というようなやり方ですね。まぁ、これもORを使って条件を3つつなぎ合わせればできますが、正直ちょっと面倒くさい。それに、候補となる値が3つならいいんですが、これが100ぐらいになったりするとかなり大変です。
こうした場合のために、Djangoには「値をリストにまとめて検索する」という機能が用意されています。
■リストに含まれるものを検索
項目__in=[値1, 値2, ……]これは、値に用意したリストを使って項目の値を調べるものです。例えば、name__in=['A', 'B', 'C'] といった具合に記述すれば、nameの値がAかBかCのものだけを検索できます。
では、これも利用例を挙げておきましょう。index関数を下のリスト欄のように書き換えて下さい。
これは、「カンマで区切った名前をすべて検索」するものです。例えば、入力フィールドに「taro, hanako, sachiko」と記入すれば、nameの値がtaroまたはhanakoまたはsachikoのいずれかの項目をすべて取り出します。
ここでは、送信されたテキストを変数に取り出した後、splitを使い、カンマでテキストを分割してリストを作成しています。
name_str = request.POST['name']これで、name_arr にはsplitでテキストを分割したリストが代入されます。このリストを使って検索を行なっていたのですね。
name_arr = name_str.split(',')
data = Person.objects.all().filter(name__in=name_arr)この検索を行っている部分を見ると、filter内にname_in とname_arrを比較する文が用意されていることがわかります。
filter(name__in=name_arr)これで、name_arrのリストに含まれているテキストを使って、name項目から値を探し出すようになります。「以下に検索対象となるリストを用意するか」を考えないといけませんが、それさえクリアできれば割と簡単に使えますよ!
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | def index(request): if request.method = = 'POST' : name_str = request.POST[ 'name' ] name_arr = name_str.split( ',' ) data = Person.objects. all (). filter (name__in = name_arr) else : data = Person.objects. all () name_str = '' context = { 'current_name' : name_str, 'msg' : 'Personのリスト' , 'data' : data, } return render(request, 'hello/index.html' , context) |
※関連コンテンツ