Ответ 1
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()])
У нас есть модель ndb, которую мы хотели бы сделать json serializable. Модели довольно просты по строкам:
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__
, или есть более быстрый способ сделать это?
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()])
Я не считаю это документированным, но для существующих моделей ext.db
вы можете использовать db.to_dict()
(см. здесь).
Будьте осторожны, хотя с db.ReferenceProperty
и db.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())
Или вы можете просто добавить вычисленное свойство к модели, как показано ниже:
class Taxes(ndb.Model):
name = ndb.StringProperty()
id = ndb.ComputedProperty(lambda self: self.key.id())
то в вашем методе get просто вызовите to_dict, и вы получите id
rows = [row.to_dict() for row in Taxes.query()]
self.response.write(json.dumps(rows))