Frage

Lassen Sie uns sagen, ich habe ein Modell wie dieses

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

Und ich werde einen GqlQuery wie diese

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

Ich mag die Ergebnisse der GqlQuery nehmen und sie in eine Art von JSON-String, die ich von verschiedenen Sprachen bearbeiten kann.


Hier ist, wie ich es jetzt tue

  1. Fügen Sie eine Methode zum Foo Klasse, die es in einem Wörterbuch wandelt

    def toDict(self):
        return {
             'id': self.id,
             'bar': self.bar,
             'baz': self'baz
           }
    
  2. Schleife durch die GqlQuery Ergebnisse und fügen Sie manuell jede Foo Instanz mit einem Wörterbuch

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

Mein Ansatz oben funktioniert, aber es fühlt sich irgendwie eklig.

Gibt es eine sauberere, "Pythonic" Art und Weise zu handhaben?

Das Ende Format muss nicht genau das, was ich habe oben getan. Es hat nur etwas sein, das schön zu JSON konvertiert, damit ich mit ihm von Javascript / PHP / was auch immer umgehen kann.

War es hilfreich?

Lösung

Hier finden Sie aktuelle google .appengine.api.datastore . Es ist die untere Ebene Datenspeicher-API, die auf google.appengine.ext.db baut, und es gibt Objekte Entity, die Unterklasse dict. Sie können es mit google.appengine.ext.gql oder (meine persönliche Präferenz) verwenden, um die Abfrageklasse, die die Notwendigkeit für Sie Textzeichenfolgen für den GQL Parser zu analysieren zu konstruieren vermeidet. Der Query-Klasse in api.datastore verhält sich genau wie die dokumentiert hier (aber kehre die untere Ebene Entity-Objekte anstelle von Modell-Instanzen).

Als Beispiel Ihre Abfrage oben als "datastore.Query umformuliert werden kann (" Foo "). Alle ()".

Andere Tipps

Ich kann nicht tun, viel besser als das, aber hier ein paar Ideen:

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)

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

Der Encoder Methode löst Ihre GQL-to-JSON schön muss. Ich würde empfehlen, einige der übermäßigen Datetime-Optionen .... als eine Epoche aus der Zeit loszuwerden? wirklich?

Sie können auf GAE verwenden web2py und zu tun:

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)

Läuft auf Oracle, PostgreSQL, MSSQL, MySQL, etc ... zu.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top