djangoでデータを使うときに良く使うのがcontextとquerysetの2つではないかと思います。
チュートリアルなどを見ていても、何も説明がないまま使い分けがされているので分かるようで良くわからないという方も多いのではないでしょうか。
そこで今回は、contextとquerysetの違いについて分かりやすく解説していきます。
contextとquerysetの違いは何?
まず、contextとquerysetの違いは、一言で言うと情報量です。
contextは、querysetよりもたくさんの情報を持っています。
また、contextは辞書型のデータですが、querysetはdjangoがデフォルトで備えているQueryset型です。
といっても、これではまだよくわからないと思いますので、具体的なコードを見ながら理解を深めていきましょう。
contextとquerysetを出力する
実際にcontextとquerysetのデータをprint関数でコンソールに出力してみましょう。
補足基本の設定は、初期設定コードという記事でまとめていますので参考にしてください。
コード-BASE/app/views.py
class AppListView(ListView):
template_name = 'list.html'
model = AppModel
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
print(context)
def get_queryset(self, **kwargs):
queryset = super().get_queryset(**kwargs)
print(queryset)
return queryset
これでcontextとquerysetがコンソールに出力されます。
簡単にコードの中身について説明していきますね。
def get_context_dataというメソッドはAppListViewが継承しているListViewクラスの中にも書かれているので、上書きすることになります。
ただ、今回はListViewクラスのメソッドをそのまま使ってcontextデータを取りたいので、super().get_context_dataというメソッドを書き、ListViewクラスに書かれているget_context_dataメソッドをそのまま使うようにしています。
その次の行でprint(context)を定義しており、この関数を使ってcontextのデータをコンソールに出力させます。
出力結果を確認する
早速contextとquerysetをコンソールで確認してみましょう。
なお、今回はAppModelにおいてデータをあらかじめ3つ作成しています。
コードcontext
{
'paginator': None,
'page_obj': None,
'is_paginated': False,
'object_list': <QuerySet [<AppModel: データ1つ目>, <AppModel: データ2つ目>, <AppModel: データ3つ目>]>,
'appmodel_list': <QuerySet [<AppModel: データ1つ目>, <AppModel: データ2 つ目>, <AppModel: データ3つ目>]>,
'view': <app.views.AppListView object at 0x7f157824ab00>
}
コードqueryset
<QuerySet [<AppModel: データ1つ目>, <AppModel: データ2つ目>, <AppModel: データ3つ目>]>
さらに、それぞれのデータの型を見ていきましょう。型は、pythonのtype関数を使って確認します。
コードcontext
<class 'dict'>
コードqueryset
<class 'django.db.models.query.QuerySet'>
contextは辞書型で、querysetはdjangoがそなえているQuerysetクラスであることが分かりました。
ここまで得られた情報をもとに、contextとquerysetの違いを明らかにしていきましょう。
querysetの情報は、contextに含まれている
まず意識したいことは、querysetの情報はcontextにも含まれているということです。
つまり、contextとquerysetはお互い違うデータを扱っているのではないということを意識しましょう。
querysetはfor文でデータを取り出すことに特化している
つぎに、querysetに入っているデータは、データベースに関連したデータだけということを確認しましょう。
ListViewなどでquerysetを使うのは、データベースに入っている情報を取り出すやすいからです。
他にもquerysetは、filterメソッドを使うことでデータベースの情報を絞り込むときにも使われますが、基本的にはデータベースに入っている情報が入っているというイメージを持つとよいでしょう。
contextは辞書型
次に、contextは辞書型ということを意識しましょう。
辞書型ですので、任意のデータをviewの中で追加することができます。例えば、context['age']=100とすれば、contextの中にデータが追加されます。
contextは、htmlに表示する内容をコントロールするために使われる
また、contextはhtmlに表示する内容をコントロールするというイメージを持つとよいでしょう。
例えば、paginatorという属性がありますが、これはhtmlファイルにおいてページ機能(ブログの下に1 2 3といった形でページを載せていますよね)をつけるかどうかを判断しています。
cntextは、データをリストで表示するのではなく、htmlの表示を便利にするために使われる。というイメージを持ちましょう。
最後に
contextとquerysetの違いを具体的なデータと共にご紹介しました。
実際に使っていく中でイメージがわいてくると思いますが、querysetはリスト表示、contextはhtml表示と整理するだけでも、この2つに対する理解がぐっと深まることでしょう。