Если у меня есть прямая ссылка на объект Property движка приложения Google, как мне получить () или установить () на него? - PullRequest
1 голос
/ 10 апреля 2009

Предположим, у меня есть класс Model с именем Bird и экземпляр Bird с именем голубь. Я знаю, что могу получить все свойства голубя (или птицы), используя

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

Это возвращает мне словарь, где ключи - это строки, которые соответствуют названию, которое я дал указанным свойствам в птицах, а значение - фактические объекты свойств. У меня вопрос, как мне получить или установить значение, используя указанные объекты свойств. Я хочу сделать это, потому что я хочу позволить клиенту динамически указывать в виде строк:

1) ключ к объекту Model

2) свойство указанного Модельного объекта

3) и значение, которое данное свойство Модельного объекта может принять

Очевидно, что мне нужно сначала получить объект Model, затем определить, существует ли указанное свойство, и, наконец, получить или установить его каким-либо образом? Это возможно? Спасибо.

1 Ответ

2 голосов
/ 03 мая 2009

Я играл с Консоль App Engine , которая отлично подходит для тестирования и экспериментов. Мне кажется, что вы хотите использовать __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'

Если вы попробуете онлайн-демонстрацию консоли, не забудьте сначала удалить мои старые экземпляры, так как мы все совместно используем одно хранилище данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...