我正在使用Appengine的内存缓存。
我有一个类TaskGroup
,我将动态设置一个属性。
from mempo.models import Task, Order, TaskAction, TaskGroup
from google.appengine.ext import ndb
from google.appengine.api import memcache
tg = TaskGroup.query().fetch(1)[0]
print 1, tg
setattr(tg, TaskGroup.JSON_TASKS_KEY, {'hello': 'world'})
print 2, getattr(tg, TaskGroup.JSON_TASKS_KEY)
KEY = 'mc_key'
memcache.delete(KEY)
memcache.set(KEY, tg)
tg2 = memcache.get(KEY)
print 3, getattr(tg2, TaskGroup.JSON_TASKS_KEY)
这是交互式控制台的输出:
1 TaskGroup(key=Key('TaskGroup', 4504974016905216), order=Key('Order', 5491235947020288), order_entry_serial=u'fc5766b2bbad4905be8753f9a6300009', orphaned=False, state=TaskGroupState(UNSTARTED, 10))
2 {'hello': 'world'}
3Traceback (most recent call last):
File "/home/vng/google_appengine/google/appengine/tools/devappserver2/python/request_handler.py", line 216, in handle_interactive_request
exec(compiled_code, self._command_globals)
File "<string>", line 16, in <module>
AttributeError: 'TaskGroup' object has no attribute 'json_tasks'
AFAIK,pickle转储动态设置的属性:
class Foo():
pass
f = Foo()
pickle.dumps(f)
Out[4]: '(i__main__\nFoo\np0\n(dp1\nb.'
In [5]: setattr(f, 'hello', 'world')
In [6]: pickle.dumps(f)
Out[6]: "(i__main__\nFoo\np0\n(dp1\nS'hello'\np2\nS'world'\np3\nsb."
有人能告诉我为什么appengine的memcache没有腌制我的JSON_TASKS_KEY属性?
答案 0 :(得分:1)
这与ndb如何处理酸洗有关。 ndb.Model实现__getstate__
,允许它覆盖它的腌制方式。特别是,ndb通过转换为它的内部序列化表示来处理它,然后对其进行编码。此内部表示仅存储它知道的属性。
如果您想将动态属性与ndb一起使用,则应该让模型扩展ndb.Expando
而不是ndb.Model
。