CategoryListView
Categoryをリスト表示するためのView。ListViewクラスを継承している。 ここでは、表示するHTMLの指定と、カテゴリ毎の記事数の集計を行う。
まず、テンプレートとしてpagesフォルダにあるcategory_list.htmlを指定している。
次にモデルからデータを抽出するために、querysetを定義している。 annotateとは「注釈をつける」という意味で、querysetに注釈として情報を付与することができる。詳しくはこちらを参照。
ここでは、以下の条件に一致するレコードを取得し、その数の情報を追加している。
・Categoryモデル
・filterメソッドで、is_public(公開状況)がTrue(公開中)である記事を抽出
・カテゴリ名毎に、該当する記事の数(Count)をnum_posts
に代入
また、上記queryset
ではRDBの仕組みを使ったCountを行っている。
下記の通り、Categoryクラスにはarticle
という項目は存在しないし、is_public
も存在していない。どうやって、存在しない項目にアクセスしているのだろうか。
もう一度、Articleクラスを確認する。
Articleモデルのcategory
はCategoryモデルのForeignKey
になっており、この外部キーを利用して、CategoryモデルからArticleモデルを呼び出している。(reverse foreign key hop)
例えば、Categoryモデルに、「日記」というnameをもつレコードがあったとする。Articleモデルでは、Categoryモデルで定義された「日記」というカテゴリ名をcategoryとして利用している。つまり、各記事(Articleの各レコード)には、どのCategory名を使っているかという情報(Categoryモデルへの参照情報)が必ず含まれている。
上記のqueryset
ではこの参照を利用して、参照元のテーブルから外部キーを利用しているモデルにアクセスしている。さらに__でつなげることで、Articleモデルの項目であるis_public
にもアクセスしている。
最終更新
役に立ちましたか?