22

json をシリアライズ可能にしたい ndb モデルがあります。モデルは次のようにかなり単純です。

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

次に、ハンドラー側では、次の行に沿って何かを行いたいと考えています。

json.dumps(Pasta.query(Pasta.name=="Ravioli").fetch())それをクライアントに返しますが、クラス Pasta は json シリアライズ可能ではないため、json 解析エラーをスローし続けます。では、問題は、実装する必要がある__str__か、または__repr__それを行うためのより優れた方法があるかということです。

4

5 に答える 5

58

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()])
于 2012-11-09T16:29:36.673 に答える
10

文書化されているとは思いませんが、既存のext.dbモデルについては使用できますdb.to_dict()(こちらを参照)。

db.ReferencePropertydb.DateTimePropertyを呼び出すとエラーが発生するので注意してくださいjson.dumps()。簡単な解決策は、カスタム JSONEncoder です。

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())
于 2013-09-21T01:56:48.817 に答える