【django】 objects.all() の使い方とサンプル

Django

クエリメソッドの中でもよく使用するall()メソッド
クエリセットの全てをコピーして出力します。

と説明しても分かりにくいとおもったため
その使い方とサンプルをこの記事に記載します。

もし、all()オブジェクトに関して
使う前に知りたい場合は見ていただけると嬉しいです。

all() 説明の前に

先の説明で、all()メソッドはクエリセットの全てを
コピーして出力すると書きましたが
all()を説明する前に”クエリセット”に関して説明を。

クエリセットはモデルのデータベースから
取り出したデータのことを指します。

このクエリセットのすべてを
一覧として変数に置き変えることができる。
それがall()メソッドの役割です。

all()メソッドの使用方法

たとえば、モデルのデータベースには
以下のようなものが入っているとします。
分かりやすいようにJSON形式で書きます。

Sample = [
    {'id': 1, 'title': 'title1', 'text': 'text1'},
    {'id': 2, 'title': 'title2', 'text': 'text2'}
]

これらをviews.pyの中にall()で出力します。
書き方は”モデルクラス名.objects.all()”です。

from django.shortcuts import render
from .models import Sample

def lists(request):
    sample_list = Sample.objects.all()
    return render(request, 'lists.html', {'sample_list':sample_list})

Sample.objects.all()だけでデータベースの中身が引き渡され
これをrenderでテンプレートに表示させます。

テンプレートで表示

all()メソッドがよく使われるのは一覧表を出す場合です。
そのため、for文を使って一覧として出力させます。

  <body>
    <div>
      <h1>List Page</h1>
    </div>
  {% for sample in sample_list %}
    <div>
      <p>{{ sample }}:{{ sample.title }}:{{ sample.text}}</p>
    </div>
  {% endfor %}
  </body>

all()メソッドで引き渡した変数sample_listから
for文を回して一つずつ出力させます。

実際の画面ではこのようになります。

{{ sample }}だけだとSample objects(1)となり、
{{ sample.title }}のようにドットでつなげれば、その要素が出てきます。

このような出力結果を<li>で箇条書きにしたり
<table>で表として表示したりできます。楽ですね。

追記 all()では中身がわからない!場合

all()メソッドを使用して表示させる場合
一部 or Sample.objects(1)のような表示になって
あれ?どんな要素があったっけ?ってなります。

そんなときには “values()” を使用すると便利です。
例えば、views.pyで以下のようになる方法もあります。

def lists(request):
    sample_list = Sample.objects.all().values() #ここ
    print(sample_list)
    return render(request, 'lists.html', {'sample_list':sample_list})

#print文の出力結果は以下(改行して分かりやすくしてます。)
#<QuerySet [{'id': 1, 'title': 'title1', 'text': 'text1'}, 
#           {'id': 2, 'title': 'title2', 'text': 'text2'}]>

他にも、values()を使ってテンプレートの方で
各要素の詳細を表示させることもできます。

  {% for sample in sample_list %}
      <div>
        <p>{{ sample }}</p>  #ここがコツ
      </div>
  {% endfor %}

上記のテンプレートでは以下のような画面になります。

もし、「あれ?何が入ってたっけ?」となった時は
使ってみてください。

以上です。

タイトルとURLをコピーしました