假设我有一个名为Bird的Model类和一个名为pigeon的Bird实例。我知道我可以使用
获得鸽子(或鸟)的所有属性properties = pigeon.properties() #Note, Bird.properties() would also work
这会返回一个字典,其中的键是与我在鸟类中提供的属性名称相匹配的字符串,值是实际的Property对象。我的问题是,如何使用所述属性对象获取或设置值。我希望这样做,因为我想允许客户端动态指定为字符串:
1)Model对象的关键
2)所述Model对象的属性
3)以及所述Model对象的前述属性可能采用的值
很明显,我需要首先获取Model对象,然后确定是否存在所述Property,最后以某种方式获取或设置它?这可能吗?谢谢。
答案 0 :(得分:2)
我玩App Engine Console,非常适合测试和试验。在我看来,你想要使用__set__
,第一个参数是你的模型实例,第二个参数是新值。接下来,您需要像往常一样put()
实例。
这是一个更清晰的控制台会话。 (我是否已经提到了App Engine控制台的功能如何?)
>>> 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'
如果您自己尝试在线控制台演示,请务必先删除旧的实例,因为我们都共享同一个数据存储。