Model のプロパティを JSON にしたい

32 views
Skip to first unread message

Toshiharu Moriyama

unread,
Jul 26, 2011, 10:52:55 PM7/26/11
to kay-us...@googlegroups.com
こんにちは。
件名と違う質問内容なのですが、 JSON にするトピックが無いので参考になると思い、この件名にしました。

Query.fetch() で得た モデル を JSON にする方法ですが、下記の場所にあるコードを利用しました。

http://code.google.com/p/google-app-engine-samples/source/browse/trunk/geochat/json.py?r=55

うまくいったのですが、Key() も JSON に含めたくなりました。
入力したデータを編集するときに、キーを使って データストアから取り出した方がいいかな?と思いまして。

しかし、json.py は Model.properties() で得られたものしか、JSON にしてくれません。

class Article(db.Model)
@property
def ekey(self):
    return str(self.key())

と、やって、Model.properties() のように、dict で取得するには、どのようにしたらよいのでしょうか?
特に
@property でなくてもかまいません。

json.py の 59行目に入れるつもりです。

あと、simplejson は GAE SDK にあるので、 kay.lib にいらないのでは?と思いました。

以上、よろしくお願いします。



ukyo

unread,
Jul 27, 2011, 8:36:31 AM7/27/11
to kay-users-ja
from google.appengine.ext.db import Model

def properties_and_key(self):
props = self.properties()
props['key'] = str(self.key())
return props

setattr(Model, 'properties_and_key', properties_and_key)

こんなかんじでメソッドを追加するのはどうでしょうか。

On 7月27日, 午前11:52, Toshiharu Moriyama <aqua.bi...@gmail.com> wrote:
> こんにちは。
> 件名と違う質問内容なのですが、 JSON にするトピックが無いので参考になると思い、この件名にしました。
>
> Query.fetch() で得た モデル を JSON にする方法ですが、下記の場所にあるコードを利用しました。
>
> http://code.google.com/p/google-app-engine-samples/source/browse/trun...

Toshiharu Moriyama

unread,
Jul 27, 2011, 6:08:43 PM7/27/11
to kay-us...@googlegroups.com
こんにちは

Attribute ってなに!って所から調べて、やっと理解できました。
view.py に properties_and_key() を追加して、例で行くと…。
と、ちょっと面倒な気がしてきました。

# view.py
from app.json import encode

def get_article(request):
  ....
  query = Article.all().order('-created')
  article = query.fetch()
  json = encode(article)
  response['article'] = json
  return render_json_response(response)

と、やっているのですが、取得した エンティティのリスト全部に setattr しないといけないですよね?
そうすると、他の Model を json にしたいとき、手間が増えてしまいます。

あと、json.py:59 といってたのは間違いでした。 json.py:55 を差し替える形にしたいです。

と、しばらく RESTViewGroup のドキュメントを見てみました。
これを使った方がいいのかなぁ、と思ったりしました。

覚えることが増えたっ!?

ukyo

unread,
Jul 28, 2011, 12:53:39 AM7/28/11
to kay-us...@googlegroups.com
json.pyを見てみるとproperties()で直接値が取れるわけじゃないみたいですね。

そうすると、56行目をoutput = {'key': str(obj.key())}に変える。
これが一番単純な方法だと思います。

Toshiharu Moriyama

unread,
Jul 28, 2011, 7:25:52 AM7/28/11
to kay-us...@googlegroups.com
ありがとうございます。
key は、どの model でも返して問題はないので(今気がついた。)、その方法でやってみます。
シンプルに一行で済みますし。(とりあえずの対応で、59行目あたりに色々書いてました。)

色々ありがとうございました。勉強になります。

CRUDViewGroup のドキュメントに、「モデルフォームで定義する以外の値を渡したい事もあります。」と、
あります。まさにそんな状況でした。

クライアント側の Form は JavaScript で生成しているので ViewGroup は敬遠してましたが、
なんか勘違いしているみたいなので、もう少し理解を深めたいと思います。

勉強ばかりで、なかなか前に進まない(^^;)
Reply all
Reply to author
Forward
0 new messages