さまざまな検索 (3/4)
作成:2018-01-14 09:03
更新:2018-01-14 09:03
更新:2018-01-14 09:03
■AND/ORによる式の連結
こうした検索条件は、1つだけしか使わない場合ばかりではありません。複数の検索条件を組み合わせて実行したい場合もあります。
複数の検索条件を利用する場合、その組み合わせ方には2つの種類があります。「AND」と「OR」です。それぞれの使い方について説明しましょう。
■AND(論理積)について
これは、filter内に複数の条件をカンマで区切って記述するだけです。こうすると、それぞれをANDでつなぎます。
■OR(論理和)について
このつなぎ方は、2つの式を|という記号でつなぎます。ただし! 用意する式は、ただ式をそのまま書いただけではダメです。Qという関数を使い、Q(○○) というような形で用意する必要があります。
――では、これも利用例を挙げておきましょう。index関数を下のリスト欄のように修正して下さい。
ここでは、フィールドにテキストを書いて送信すると、nameとmailの両方の項目から値を検索し、どちらか一方でも値が含まれているものをすべて表示しています。検索の処理は、以下のようにfilterを用意しています。
複数の検索条件を利用する場合、その組み合わせ方には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関数を下のリスト欄のように修正して下さい。
ここでは、フィールドにテキストを書いて送信すると、nameとmailの両方の項目から値を検索し、どちらか一方でも値が含まれているものをすべて表示しています。検索の処理は、以下のようにfilterを用意しています。
filter(Q(name__contains=name_str)|Q(mail__contains=name_str))「どちらか一方でも値が含まれていれば」ということですから、これはOR検索の処理だとわかりますね。このfilterメソッドの部分をよく見ると、こんな具合に書かれていることがわかります。
filter( Q(……略……) | Q(……略……) )Qを使って条件を用意し、それを | 記号でつないでいます。Q関数が追加されるのでANDよりは若干わかりにくい感じになっていますが、書き方さえわかれば割と簡単に作ることができるでしょう。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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)
※関連コンテンツ