データベースアクセスを行う (4/5)
作成:2018-01-06 08:08
更新:2018-01-06 08:08
更新:2018-01-06 08:08
■名前で検索する
getは、あくまで「条件に合うレコードを1つ取り出す」というものですので、検索対象のレコードが多数あるような場合には利用できません。このような場合は、「filter」というメソッドを利用します。
filterは、名前の通り、レコードをフィルター処理するものです。わかりやすくいえば、「特定の条件でレコードを絞り込む」働きをします。まぁやっていることは検索と同じです。SQLでいえば、where句に相当するのがfilterメソッドだ、と考えていいでしょう。
このfilterメソッドは以下のように呼び出します。
基本的な使い方は、getとほぼ同じですね。allの戻り値のQuerySetからfilterを呼び出します。引数には、やはりgetと同様に条件となる式を用意します。filter(name='taro') なら、nameの値が'taro'のレコードのみ絞り込んで取り出せます。
基本的な使い方はgetと同じですが、戻り値は違います。getはモデルインスタンスが直接返されましたが、filterではallと同様、QuerySetインスタンスが返されます。ですから、戻り値から繰り返し構文で順にモデルインスタンスを取り出し、処理することができます。
では、実際の利用例を見てみましょう。下のリストは、helloのviews.pyを書き換えたものです。
ここでは、if request.method == 'POST': でPOSTで送信されたかどうかをチェックし、POST送信だった場合は、nameというフォームの値を取り出して絞り込みを行います。
これで、nameで送信された値を元にレコードの検索が行えるようになりました。後は、テンプレートを修正するだけですね。
filterは、名前の通り、レコードをフィルター処理するものです。わかりやすくいえば、「特定の条件でレコードを絞り込む」働きをします。まぁやっていることは検索と同じです。SQLでいえば、where句に相当するのがfilterメソッドだ、と考えていいでしょう。
このfilterメソッドは以下のように呼び出します。
変数 = モデル .objects.all().filter( 条件 )
基本的な使い方は、getとほぼ同じですね。allの戻り値のQuerySetからfilterを呼び出します。引数には、やはりgetと同様に条件となる式を用意します。filter(name='taro') なら、nameの値が'taro'のレコードのみ絞り込んで取り出せます。
基本的な使い方はgetと同じですが、戻り値は違います。getはモデルインスタンスが直接返されましたが、filterではallと同様、QuerySetインスタンスが返されます。ですから、戻り値から繰り返し構文で順にモデルインスタンスを取り出し、処理することができます。
では、実際の利用例を見てみましょう。下のリストは、helloのviews.pyを書き換えたものです。
ここでは、if request.method == 'POST': でPOSTで送信されたかどうかをチェックし、POST送信だった場合は、nameというフォームの値を取り出して絞り込みを行います。
name_str = request.POST['name']
data = Person.objects.all().filter(name=name_str)
これで、nameで送信された値を元にレコードの検索が行えるようになりました。後は、テンプレートを修正するだけですね。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
from django.shortcuts import render from django.http import HttpResponse from .models import Person def index(request): if request.method == 'POST': name_str = request.POST['name'] data = Person.objects.all().filter(name=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)
※関連コンテンツ