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

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

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

■AND/ORによる式の連結

こうした検索条件は、1つだけしか使わない場合ばかりではありません。複数の検索条件を組み合わせて実行したい場合もあります。

複数の検索条件を利用する場合、その組み合わせ方には2つの種類があります。「AND」と「OR」です。それぞれの使い方について説明しましょう。

■AND(論理積)について
filter( 式1, 式2 )
ANDとは、「2つの条件の両方に合致するものを検索する」というやり方です。AとBの条件があったら、「AもBも両方に合致する」というものだけを取り出します。これは日本語で「論理積」と呼ばれます。

これは、filter内に複数の条件をカンマで区切って記述するだけです。こうすると、それぞれをANDでつなぎます。

■OR(論理和)について
filter( Q(式1) | Q(式2) )
もう1つのつなぎ方は、「2つの条件のどちらか片方に合致すれば取り出すというやり方です。これは、「論理和」と呼ばれます。

このつなぎ方は、2つの式を|という記号でつなぎます。ただし! 用意する式は、ただ式をそのまま書いただけではダメです。Qという関数を使い、Q(○○) というような形で用意する必要があります。

――では、これも利用例を挙げておきましょう。index関数を下のリスト欄のように修正して下さい。

ここでは、フィールドにテキストを書いて送信すると、namemailの両方の項目から値を検索し、どちらか一方でも値が含まれているものをすべて表示しています。検索の処理は、以下のようにfilterを用意しています。
filter(Q(name__contains=name_str)|Q(mail__contains=name_str))
「どちらか一方でも値が含まれていれば」ということですから、これはOR検索の処理だとわかりますね。このfilterメソッドの部分をよく見ると、こんな具合に書かれていることがわかります。
filter( Q(……略……) | Q(……略……) )
Qを使って条件を用意し、それを | 記号でつないでいます。Q関数が追加されるのでANDよりは若干わかりにくい感じになっていますが、書き方さえわかれば割と簡単に作ることができるでしょう。

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

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

●プログラム・リスト●

from django.db.models import Q    #追記する
def index(request):
    if request.method == 'POST':
        name_str = request.POST['name']
        data = Person.objects.all().filter(Q(name__contains=name_str)|Q(mail__contains=name_str))
    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入門」に戻る