When it’s ready.

出来るまで出来ない

モデルに逆参照のメソッド追加すれば楽チンだよ

codereposを覗いてみたら、mattn氏がblogのソースを上げていたのでそれを眺めていたら、モデルの中にメソッドを追加しているところを発見。どーやら、selfのhashを返すメソッドを追加指定ルポイ。そこで、ピーンと来たので逆参照して、ヒモづいているTagのListを返すメソッドを追加してみた。

class Core(db.Model):
  body = db.StringProperty(required = True)
  create_at = db.DateTimeProperty(auto_now_add = True)

というモデルに

  def getTags(self):
    return [x.ref_tag.body for x in self.table_set]

こんなメソッドを追加してみた。後で困る(読めなくなる)かも知れないけど、リスト内包表記で書いてみた。
自分の為にforで書き直すと

arr = []
for i in self.table_set:
  arr.append(i.ref_tag.body)
return arr

という感じだ。モデルに少し機能を付けるだけでコントローラが半分くらいになった気がする。
そろそろ、インターフェースに手を付けたいので、apiから作ることにした。

とりあえづ、最新10個のcoreデータをtagデータ付きでJsonのレスポンスを返す部分を作った。

class ApiGet(webapp.RequestHandler):
  def get(self):
    cores = db.GqlQuery(
      'SELECT * from Core ORDER BY create_at DESC')
    values = cores.fetch(10)
    vals = []
    for i in values:
      one_tane = {}
      one_tane['core']={'body':i.body,'create_at':str(i.create_at)}
      one_tane['tags'] = i.getTags()
      vals.append(one_tane)
    values = simplejson.dumps(vals, indent=2,ensure_ascii=False)
    self.response.out.write(values)

urlも分けたいので、appも変更しておく

def main():
  app = webapp.WSGIApplication([
                                ('/get', ApiGet),('/', index),
                                ], debug=True)
  wsgiref.handlers.CGIHandler().run(app)

問題

あまり支障は無いのかもしれないけど
self.response.out.write(values)
すると、simplejsonでindent設定してても、無視されて一行でレスポンスが返ってくる。
非常に見難い。