全レコードを取り出すのは簡単でしたが、では特定のレコードだけを取り出すにはどうするのでしょうか。例えば、指定のIDのレコードだけを取り出す、というような場合ですね。
これは、
QuerySetの「
get」メソッドを使うのが基本でしょう。これは以下のように利用します。
変数 = モデル .objects.all().get( 条件 )
allの後に続けて
getを呼び出します。引数には、検索するレコードの条件となる文を指定します。これは、とりあえず「
○○=××」のような式を書く、と覚えておけばいいでしょう。「
項目名 = 値」というように記述することで、その項目の値が指定のものであるレコードだけを検索します。
例えば、
get(id=1) というようにすれば、IDの値が1のレコードを検索するわけですね。この
getは、
QuerySetではなく、検索条件に合致したモデルインスタンスをそのまま返します。
allとは戻り値が異なるので注意して下さい。
では、実際の利用例を挙げておきましょう。
views.pyを下のリスト欄のように書き換えて下さい。そして、「
hello」内の
url.pyを開き、
urlpatternsの部分を以下のように修正しましょう。
urlpatterns = [
path('<int:id>/', views.index, name='index'),
path('', views.index, name='index'),
]
これで、
/helloとアクセスすれば全レコードが表示され、
/hello/番号 とすれば、そのID番号のレコードだけが表示されるようになります。ここでは
index関数の定義を以下のように修正してあります。
def index(request, id=0):urlpatternsを追加することで、URLからidの値を渡せるようになります。このidを元に、以下のようにレコードを検索しています。
data = Person.objects.all().get(id=id)
data = [data]
get(id=id)を追加することで、指定のIDのレコードだけが取り出されるようになりました。
index.html側では、イテレータで値が渡される前提で繰り返し処理をしていますので、取り出したモデルインスタンスをリストにおさめる形にする必要があります。data = [data]というようにしてリストにしておけば、全レコードでも単レコードでも同じように
index.htmlで表示できますね。
from django.shortcuts import render
from django.http import HttpResponse
from .models import Person
def index(request, id=0):
if id == 0:
data = Person.objects.all()
else:
data = Person.objects.all().get(id=id)
data = [data]
context = {
'msg': 'Personのリスト',
'data': data,
}
return render(request, 'hello/index.html', context)