#python #google-app-engine #app-engine-ndb
# #python #google-app-engine #app-engine-ndb
Вопрос:
Я пытаюсь установить атрибут для своей модели,
class Foo(ndb.Model):
name = ndb.StringProperty()
- Извлечение объекта Foo из memcache
- Если не в memcache, выполните запрос из базы данных. Здесь я хотел бы прикрепить дополнительную информацию к экземпляру Foo
foo.special_name = "don't persist this"
- Передайте этот объект из memcache в мой пользовательский JSONEncoder
- Сбросьте этот объект в словарь, foo = {name:»привет», special_name:»не сохраняйте это»}
AFAIK, я не могу установить атрибуты классов ndb.Model, которые не являются полями.
Я боюсь использовать ndb.Expando, потому что я беспокоюсь, что этот объект сохранится и special_name
будет сохранен в моей базе данных.
Какой самый простой способ добавить временное одноразовое значение foo
?
Редактировать:
>>> class Foo(ndb.Model):
name = ndb.StringProperty()
>>> f = Foo()
>>> f.put()
Key('Foo', 26740114379063)
>>> f.bar = 123
>>> f
Foo(name=None)
>>> f.bar
Traceback (most recent call last):
File "/base/data/home/apps/shell/1.335852500710379686/shell.py", line 267, in get
exec compiled in statement_module.__dict__
File "<string>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'bar'
>>> setattr(f, 'bar', 123)
>>> f
Foo(name=None)
>>> f.bar
Traceback (most recent call last):
File "/base/data/home/apps/shell/1.335852500710379686/shell.py", line 267, in get
exec compiled in statement_module.__dict__
File "<string>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'bar'
>>> setattr(f, 'bar', 123)
>>> getattr(f, 'bar')
Traceback (most recent call last):
File "/base/data/home/apps/shell/1.335852500710379686/shell.py", line 267, in get
exec compiled in statement_module.__dict__
File "<string>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'bar'
Ответ №1:
«Я не могу установить атрибуты классов ndb.Model, которые не являются полями».
Почему ты так думаешь? Экземпляры модели — это просто объекты, и, как и любой другой объект в Python [*], вы можете устанавливать для них произвольные атрибуты столько, сколько захотите.
[*]: (пока класс не определяет __slots__
, какой ndb.Model не определяет)
Комментарии:
1. Действительно? Я пытался сделать это: f = Foo (); f.put(); f.bar = 123; >>> f.bar AttributeError: объект ‘Foo’ не имеет атрибута ‘bar»
2. хорошо, похоже, я использовал устаревшую оболочку из API appengine. Это работает на моей текущей консоли благодаря