3

假设我有一个这样的模型

class Foo(db.Model):
    id = db.StringProperty()
    bar = db.StringProperty()
    baz = db.StringProperty()

我要像这样的 GqlQuery

foos = db.GqlQuery("SELECT * FROM Foo")

我想获取 GqlQuery 的结果并将其转换为某种 JSON 字符串,我可以使用不同的语言对其进行操作。


这就是我现在的做法

  1. Foo类添加一个方法,将其转换为字典

    def toDict(self):
        return {
             'id': self.id,
             'bar': self.bar,
             'baz': self'baz
           }
    
  2. 循环遍历 GqlQuery 结果并手动将每个 Foo 实例添加到字典

    fooDict = {}
    
    for foo in foos:
        fooDict[foo.id] = foo.toDict()
    
    return simplejson.dumps(fooDict)
    

我上面的方法有效,但感觉有点恶心。

有没有更干净、更“Pythonic”的方式来处理这个问题?

最终格式不必完全是我上面所做的。它必须是可以很好地转换为 JSON 的东西,这样我就可以从 Javascript/PHP/whatever 处理它。

4

4 回答 4

2

看看google.appengine.api.datastore。它是 google.appengine.ext.db 构建的较低级别的数据存储 API,它返回 Entity 对象,它是 dict 的子类。您可以使用带有google.appengine.ext.gql的GQL 来查询它,或者(我个人的偏好)使用 Query 类,这样就无需为 GQL 解析器构建文本字符串来解析。api.datastore 中的 Query 类的行为与此处记录的完全一样(但返回较低级别的 Entity 对象而不是 Model 实例)。

例如,您上面的查询可以重新表述为“datastore.Query("Foo").all()”。

于 2008-10-17T15:37:18.057 回答
1

我不能做得比这更好,但这里有几个想法:

class Foo:
    id = db.StringProperty() # etc.
    json_attrs = 'id bar baz'.split()

# Depending on how easy it is to identify string properties, there
# might also be a way to assign json_attrs programmatically after the
# definition of Foo, like this
Foo.json_attrs = [attr for attr in dir(Foo)
                  if isStringProperty(getattr(Foo, attr))]

fooDict=dict((foo.id,dict(getattr(foo, attr)
                          for attr in Foo.json_attrs))
              for foo in foos)
于 2008-10-17T14:21:25.480 回答
0

http://code.google.com/p/google-app-engine-samples/source/browse/trunk/geochat/json.py?r=55

编码器方法将很好地解决您的 GQL-to-JSON 需求。我建议摆脱一些过多的日期时间选项......作为一个时代的超时时间?真的吗?

于 2008-10-18T08:41:26.540 回答
-1

您可以在 GAE 上使用 web2py 并执行以下操作:

db.define_table('foo',SQLField('bar'),SQLField('baz'))
rows=db(db.foo.id>0).select()
### rows is a list, rows.response is a list of tuples
for row in rows: print  dict(row)

也可以在 Oracle、Postgresql、Mssql、mysql 等上运行。

于 2008-11-03T17:15:14.563 回答