Djangoでビューを使ってみる

2006年03月15日(水) 21:59

今日まで出張中な訳ですが。。

データベースのビューはO/R Mapperで常に懸念事項としてあがってくる。
Djangoの場合もmodelの定義からデータベース構造ができあがる仕組みなので、ビューを使うのは一般的ではない。
ただ、実際はオブジェクトとして全部引っ張り出してから集計とかを行うのはばかげているので、ビューを扱って問題がないかを確認してみたというわけ。
実際に使っているのは、エントリのある月を一覧するところ(だってDjango本家のアーカイブはテンプレートに直に書いてあるんだもん。見間違え?)。
CREATE VIEW文は次のようにした。

create view djablog_archives as
 select
  yearmonth as id,
  yearmonth as yearmonth
 from (
   select 
    distinct(to_char(create_date, 'yyyymm')) as yearmonth
   from djablog_entry
   order by yearmonth desc
   ) archives
  order by id desc
; 

わざわざidという項目としても出力しているのは、Djangoがidを欲しがるだろうとの勝手な思いこみ。
みての通り、只単に年月をユニークに出しているだけ。
modelの方は、これまた汚いけど、こうなっている。

2006/03/17 追記
辞書を使えとの指摘。確かに!

class Archives(models.Model) :
    yearmonth = models.CharField(maxlength=6, blank=False)

    def get_path(self) :
        month = ''
        year = self.yearmonth[0:4]
        mm = self.yearmonth[4:6]
        print mm
        if mm == '01' :
            month = 'jan'
        elif mm == '02' :
            month = 'feb'
        elif mm == '03' :
            month = 'mar'
        elif mm == '04' :
            month = 'apr'
        elif mm == '05' :
            month = 'may'
        elif mm == '06' :
            month = 'jun'
        elif mm == '07' :
            month = 'jul'
        elif mm == '08' :
            month = 'aug'
        elif mm == '09' :
            month = 'sep'
        elif mm == '10' :
            month = 'oct'
        elif mm == '11' :
            month = 'nov'
        else :
            month = 'dec'
        return '/%s/%s/' % (year, month)

Archive表示が/yyyy/mon/を求めるので、変換している。
VIEWで出力する際にmonで出力でもいいんだけど、並べ替えが面倒なので、modelでmonに無理矢理変換しちゃった。
あとは、カスタムtagを作ってブログのベースで呼び出してぐるぐるすると、トップページとかに出ているArchivesができあがる。


 
ponybadge

Powered by

Feedbacks

Tweets

Tags

Calendar