2009-04-09 11 views
1

Angenommen, ich habe eine Modellklasse namens Bird und eine Instanz von Bird namens pigeon. Ich weiß, ich kann alle Eigenschaften von Pigeon (oder Vogel)Wenn ich einen direkten Verweis auf eine Google App Engine Property-Objekt habe, wie bekomme ich es() oder set() darauf?

properties = pigeon.properties() #Note, Bird.properties() would also work 

Das gibt mir ein Wörterbuch mit dem die Tasten Strings sind, die mit dem Namen übereinstimmen Ich sagte, gab Eigenschaften bei Vögeln und der Wert sind tatsächliche Objekt Objekte . Meine Frage ist, wie bekomme oder setze ich den Wert mit diesen Eigenschaft Objekte. Ich möchte, dies zu tun, weil ich ein Client zulassen will dynamisch als Strings angeben:

1) der Schlüssel zu einem Model-Objekt

2) eine Eigenschaft des Model-Objekt

3) und ein Wert, den die oben erwähnte Eigenschaft des Model-Objekts annehmen könnte

Also klar, ich muss zuerst das Model-Objekt holen, dann feststellen, ob diese Eigenschaft existiert, und schließlich bekommen oder setzen Sie es irgendwie? Ist das möglich? Vielen Dank.

Antwort

2

Ich spielte mit App Engine Console herum, die großartig zum Testen und Experimentieren ist. Es sieht für mich so aus, als ob Sie __set__ verwenden möchten, wobei das erste Argument Ihre Modellinstanz und das zweite Argument der neue Wert ist. Als nächstes müssen Sie put() die Instanz wie gewohnt.

Hier ist die Konsolensitzung, um es klarer zu machen. (Habe ich erwähnt, wie App Engine-Konsole ist genial?)

>>> from google.appengine.ext import db 
>>> class Bird(db.Model): 
... name = db.StringProperty() 
... can_fly = db.BooleanProperty() 
... 
>>> def summarize(): 
... for name in ('Pesto', 'Bobby'): 
...  count = Bird.all().filter('name =', name).count() 
...  print 'I found %d birds named %s' % (count, name) 
... 
>>> summarize() 
I found 0 birds named Pesto 
I found 0 birds named Bobby 
>>> pigeon = Bird(name='Pesto', can_fly=True) 
>>> pigeon.put() 
datastore_types.Key.from_path('Bird', 41015L, _app=u'con') 
>>> summarize() 
I found 1 birds named Pesto 
I found 0 birds named Bobby 
>>> props = pigeon.properties() 
>>> props 
{'can_fly': <google.appengine.ext.db.BooleanProperty object at 0x46ddd1cc3ddb2268>, 'name': <google.appengine.ext.db.StringProperty object at 0x46ddd1cc3ddb2fe8>} 
>>> prop = props['name'] 
>>> prop 
<google.appengine.ext.db.StringProperty object at 0x46ddd1cc3ddb2a68> 
>>> prop.__set__(pigeon, 'Bobby') 
>>> pigeon.name 
'Bobby' 
>>> pigeon.put() 
datastore_types.Key.from_path('Bird', 41015L, _app=u'con') 
>>> summarize() 
I found 0 birds named Pesto 
I found 1 birds named Bobby 
>>> bobby = Bird.all().filter('name =', 'Bobby').fetch(1)[0] 
>>> bobby.name 
u'Bobby' 

Wenn Sie die Online-Konsole versuchen Demo selbst, sollten Sie zuerst meine alten Instanzen zu löschen, da wir alle die gleiche Datenspeicher.

+0

Das ist genau richtig. Weitere Informationen darüber, warum es so funktioniert, finden Sie in Raymond Hettingers exzellentem "Anleitung für Deskriptoren": http://users.rcn.com/python/download/Descriptor.htm –

Verwandte Themen