libro
www.tuyano.com
初心者のためのDjango 2.0入門

さまざまな検索 (4/4)

作成:2018-01-14 09:05
更新:2018-01-14 09:05

■リストの項目を検索する

ここまで検索は、用意されたテキストや数値をテーブル内に記録されている値と較べて絞り込む、というものでした。検索する対象となる値は、常に1つだけでした。

が、「複数の値を用意して検索する」という場合もあります。「○○の値が、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 = name_str.split(',')
これで、name_arr にはsplitでテキストを分割したリストが代入されます。このリストを使って検索を行なっていたのですね。
data = Person.objects.all().filter(name__in=name_arr)
この検索を行っている部分を見ると、filter内にname_in name_arrを比較する文が用意されていることがわかります。
filter(name__in=name_arr)
これで、name_arrのリストに含まれているテキストを使って、name項目から値を探し出すようになります。「以下に検索対象となるリストを用意するか」を考えないといけませんが、それさえクリアできれば割と簡単に使えますよ!

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

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)

※関連コンテンツ

「初心者のためのDjango 2.0入門」に戻る