モデルに逆参照のメソッド追加すれば楽チンだよ
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設定してても、無視されて一行でレスポンスが返ってくる。
非常に見難い。