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

データベースアクセスを行う (4/5)

作成:2018-01-06 08:08
更新:2018-01-06 08:08

■名前で検索する

getは、あくまで「条件に合うレコードを1つ取り出す」というものですので、検索対象のレコードが多数あるような場合には利用できません。このような場合は、「filter」というメソッドを利用します。

filterは、名前の通り、レコードをフィルター処理するものです。わかりやすくいえば、「特定の条件でレコードを絞り込む」働きをします。まぁやっていることは検索と同じです。SQLでいえば、where句に相当するのがfilterメソッドだ、と考えていいでしょう。

このfilterメソッドは以下のように呼び出します。
変数 = モデル .objects.all().filter( 条件 )

基本的な使い方は、getとほぼ同じですね。allの戻り値のQuerySetからfilterを呼び出します。引数には、やはりgetと同様に条件となる式を用意します。filter(name='taro') なら、nameの値が'taro'のレコードのみ絞り込んで取り出せます。

基本的な使い方はgetと同じですが、戻り値は違います。getはモデルインスタンスが直接返されましたが、filterではallと同様、QuerySetインスタンスが返されます。ですから、戻り値から繰り返し構文で順にモデルインスタンスを取り出し、処理することができます。

では、実際の利用例を見てみましょう。下のリストは、helloviews.pyを書き換えたものです。

ここでは、if request.method == 'POST': でPOSTで送信されたかどうかをチェックし、POST送信だった場合は、nameというフォームの値を取り出して絞り込みを行います。
name_str = request.POST['name']
data = Person.objects.all().filter(name=name_str)

これで、nameで送信された値を元にレコードの検索が行えるようになりました。後は、テンプレートを修正するだけですね。

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

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)

※関連コンテンツ

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