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などから処理できます。

4

4 に答える 4

2

google.appengine.api.datastoreを見てください。これは、google.appengine.ext.db が構築される下位レベルのデータストア API であり、dict のサブクラスである Entity オブジェクトを返します。google.appengine.ext.gqlでGQL を使用してクエリを実行するか、(個人的な好みでは) Query クラスを使用すると、GQL パーサーが解析するテキスト文字列を作成する必要がなくなります。api.datastore の Query クラスは、ここに記載されているものとまったく同じように動作します(ただし、Model インスタンスではなく、下位レベルの Entity オブジェクトを返します)。

例として、上記のクエリは "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 から 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 に答える