db.Modelに@Propertyを追加

木曜日, 2月 24th, 2011 by

PySNSの日記の投稿日時表記をUTCからJSTに変更しました。日時計算を複数回実装するのはDRYの原則に反するので、Modelにプロパティーを追加し、そのプロパティーの値を表示するように変更しました。

ソースコード

モデルの拡張
末尾の3行が追加分です。entry_date_in_jstは外からアクセスするとフィールドのように見えますが、実体はありません。

1
2
3
4
5
6
7
8
class Diary(db.Model):
  user = db.ReferenceProperty(reference_class = User, collection_name = "diaries")
  title = db.StringProperty()
  body = db.TextProperty()
  entry_date = db.DateTimeProperty(auto_now_add = True)
  @property
  def entry_date_in_jst(self):
    return self.entry_date + datetime.timedelta(hours=9)

テンプレートの呼び出しをentry_dateからentry_date_in_jstに変更。
変更前

1
2
<li><a href="/diary?key={{diary.key}}&phpMyAdmin=cfc2644bd9c947213a0141747c2608b0">{{diary.title}}</a>
(<a href="/user?key={{diary.user.key}}&phpMyAdmin=cfc2644bd9c947213a0141747c2608b0">{{diary.user.nickname}}</a> | {{diary.entry_date|date:"Y-m-d H:i:s"}})</li>

変更後

1
2
<li><a href="/diary?key={{diary.key}}&phpMyAdmin=cfc2644bd9c947213a0141747c2608b0">{{diary.title}}</a>
(<a href="/user?key={{diary.user.key}}&phpMyAdmin=cfc2644bd9c947213a0141747c2608b0">{{diary.user.nickname}}</a> | {{diary.entry_date_in_jst|date:"Y-m-d H:i:s"}})</li>

まとめ

db.Modelにプロパティーとして実装することで、同じ処理を複数個所で実装せずにすんだ。

Facebook comments:

comments

Leave a Reply


Get Adobe Flash player
single