Запрос хранилища данных Google App Engine к JSON с Python - PullRequest
2 голосов
/ 21 марта 2011

Как я могу получить объект JSON в python от получения данных через хранилище данных Google App Engine?

У меня есть модель в хранилище данных со следующим полем:

id
key_name
object
userid
created

Теперь я хочу получить все объекты для одного пользователя:

query = Model.all().filter('userid', user.user_id())

Как я могу создать объект JSON из запроса, чтобы я мог его написать?

Я хочу получить данные с помощью вызова AJAX.

Ответы [ 3 ]

7 голосов
/ 29 сентября 2011

Не уверены, что получили ответ, который искали, но имели ли вы в виду, как анализировать данные модели (записи) в объекте Query непосредственно в объект JSON?(По крайней мере, это то, что я искал).

Я написал это, чтобы проанализировать записи из объекта Query в список объектов JSON:

def gql_json_parser(query_obj):
    result = []
    for entry in query_obj:
        result.append(dict([(p, unicode(getattr(entry, p))) for p in entry.properties()]))
    return result

Вы можете иметь свое приложениеотвечать на запросы AJAX, кодируя его с помощью simplejson, например:

query_data = MyModel.all()
json_query_data = gql_json_parser(query_data)
self.response.headers['Content-Type'] = 'application/json'
self.response.out.write(simplejson.dumps(json_query_data))

Ваше приложение вернет что-то вроде этого:

[{'property1': 'value1', 'property2': 'value2'}, ...]

Дайте мне знать, если это поможет!

1 голос
/ 21 марта 2011

Если я вас правильно понял, я внедрил систему, которая работает примерно так. Похоже, вы хотите сохранить произвольный объект JSON в модели хранилища данных GAE. Чтобы сделать это, вам нужно закодировать JSON в какую-нибудь строку по пути в базу данных и декодировать ее из строки в структуру данных Python на выходе. Вам нужно будет использовать кодер / декодер JSON для этого. Я думаю, что инфраструктура GAE включает один. Например, вы можете использовать «класс-оболочку» для обработки кодирования / декодирования. Что-то в этом роде ...

class InnerClass(db.Model):
    jsonText = db.TextProperty()
    def parse(self):
        return OuterClass(self)

class Wrapper:
    def __init__(self, storage=None):
        self.storage = storage
        self.json = None
        if storage is not None:
            self.json = fromJsonString(storage.jsonText)
    def put(self):
        jsonText  = ToJsonString(self.json)
        if self.storage is None:
            self.storage = InnerClass()
        self.storage.jsonText = jsonText
        self.storage.put()

Затем всегда работайте с разобранными объектами-обертками вместо внутреннего класса

def getall():
    all = db.GqlQuery("SELECT * FROM InnerClass")
    for x in all:
        yield x.parse()

(непроверенные). См. datastoreview.py для некоторых реализаций модели, которые работают следующим образом.

0 голосов
/ 02 декабря 2011

Я сделал следующее, чтобы преобразовать объект запроса Google в json.Я также использовал логику в jql_json_parser выше, за исключением части, где все конвертируется в юникод.Я хочу сохранить типы данных, такие как integer, float и null.

import json
class JSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if hasattr(obj, 'isoformat'): #handles both date and datetime objects
            return obj.isoformat()
        else:
            return json.JSONEncoder.default(self, obj)

class BaseResource(webapp2.RequestHandler):
    def to_json(self, gql_object):
        result = []
        for item in gql_object:
            result.append(dict([(p, getattr(item, p)) for p in item.properties()]))
        return json.dumps(result, cls=JSONEncoder)

Теперь вы можете создавать подклассы BaseResource и вызывать self.to_json для gql_object

...