2012-11-09 5 views
19

jsonシリアライズ可能にするndbモデルがあります。そして、ハンドラ側で我々はの線に沿って何かやりたいAppEngine ndbモデルをjsonシリアライズ可能にする

class Pasta(ndb.Model): 
    name = ndb.StringProperty() 
    type = ndb.StringProperty() 
    comments = ndb.JsonProperty() 

json.dumps(Pasta.query(Pasta.name=="Ravioli").fetch())をし、それをクライアントに返しますが、それはJSONを投げ続けたモデルは、の線に沿ってかなり単純ですクラスPastaはjsonシリアライザブルではないため、解析エラーが発生します。ですから、質問は、__str__または__repr__を実装する必要があるのですか、それとももっと簡単な方法ですか?

+4

これを見てください:http://stackoverflow.com/questions/1531501/json-serialization-of-google-app-engine-models –

+1

それをやってください。ありがとうございました。私はそれらを検索するときにほとんどこれらの質問を見つけることはできません。 – rdodev

+0

NP。それはDB用ですが、変換するのは大したことではありません。 –

答えて

48

ndb.Modelインスタンスがto_dict()機能があります。 https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict

を最も簡単な方法は次のとおりです。

json.dumps([p.to_dict() for p in Pasta.query(Pasta.name == "Ravioli").fetch()]) 
+0

Aweosme。それは私たちの生活をよりシンプルにし、コードをきれいにします:) – rdodev

+10

'to_dict'にモデルの' key'が含まれていないことには、たぶん注目する価値があります。したがって、p in ...のために 'json.dumps([dict(p.to_dict()、** dict(id = p.key.id()))のようなことをしたいかもしれません。' –

+5

これは、日時です – Kishan

9

参照(私はそれが文書化されています信じていませんが、既存のext.dbモデルのために、あなたはdb.to_dict()を使用することができますhere )。

json.dumps()に電話するとエラーが発生するので、db.ReferencePropertyのものとdb.DateTimePropertyのものは注意してください。その後

from datetime import datetime, date, time 
from google.appengine.ext import db 

import json 

class JSONEncoder(json.JSONEncoder): 

    def default(self, o): 
     # If this is a key, you might want to grab the actual model. 
     if isinstance(o, db.Key): 
      o = db.get(o) 

     if isinstance(o, db.Model): 
      return db.to_dict(o) 
     elif isinstance(o, (datetime, date, time)): 
      return str(o) # Or whatever other date format you're OK with... 

これで符号化するため:

JSONEncoder().encode(YourModel.all().fetch()) 
1

それとも、単に以下のようなモデルに計算されたプロパティを追加することができます。

class Taxes(ndb.Model): 
    name = ndb.StringProperty() 
    id = ndb.ComputedProperty(lambda self: self.key.id()) 

を、その後迅速な解決策は、カスタムJSONEncoderですgetメソッドでto_dictを呼び出すと、IDが取得されます。

rows = [row.to_dict() for row in Taxes.query()] 
self.response.write(json.dumps(rows))