Подтвердить что ты не робот

AppEngine Создание моделей ndb json serializable

У нас есть модель 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__, или есть более быстрый способ сделать это?

4b9b3361

Ответ 2

Я не считаю это документированным, но для существующих моделей 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())

Ответ 3

Или вы можете просто добавить вычисленное свойство к модели, как показано ниже:

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))