Как мне прикрепить временную информацию к моему экземпляру модели appengine ndb?

#python #google-app-engine #app-engine-ndb

# #python #google-app-engine #app-engine-ndb

Вопрос:

Я пытаюсь установить атрибут для своей модели,

 class Foo(ndb.Model):
  name = ndb.StringProperty()
 
  1. Извлечение объекта Foo из memcache
  2. Если не в memcache, выполните запрос из базы данных. Здесь я хотел бы прикрепить дополнительную информацию к экземпляру Foo foo.special_name = "don't persist this"
  3. Передайте этот объект из memcache в мой пользовательский JSONEncoder
  4. Сбросьте этот объект в словарь, 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. Это работает на моей текущей консоли благодаря