• contextとquerysetの違いについて分かりやすく解説【オブジェクトで違いを確認】

    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つに対する理解がぐっと深まることでしょう。

     

    ~Django無料講義~のご案内

    Code for Djangoが、4時間超の無料Django講義をはじめました

    •  ・本を出版したCode for Djangoの
       製作者が作ったサイトです。
    •  ・Code for Djangoの内容も、
       動画で詳しく解説しています。
    •  ・動画は順次ふやしていきますので、
       ただで学び続けることが可能です。
    •  ・Djangoの効率的なスキルアップに、
       是非お役立て下さい。