NDB缓存临时/辅助属性。我可以把它关掉吗?

时间:2012-10-04 01:08:50

标签: google-app-engine app-engine-ndb

使用NDB时,看起来临时变量也会被缓存。

class MyModel(ndb.Model)

    def __init__(self, *args, **kwds):
        self._temporary = []
        ndb.Model.__init__(self, *args, **kwds)

有没有办法不将临时/辅助变量存储在缓存中?

编辑:

这是一个简单的测试案例,证明了我的问题:

#Python imports
import unittest

# GAE imports
from google.appengine.ext import testbed
from google.appengine.datastore import datastore_stub_util
from google.appengine.ext import ndb


class TestModel(ndb.Model):

    username = ndb.StringProperty()

    def __init__(self, *args, **kwds):
        self._temp = []
        ndb.Model.__init__(self, *args, **kwds)

class TestModels(unittest.TestCase):

    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()

        self.testbed.init_taskqueue_stub()
        self.testbed.init_urlfetch_stub()
        self.testbed.init_mail_stub()
        self.testbed.init_images_stub()
        self.testbed.init_blobstore_stub()

        self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(probability=1)
        self.testbed.init_datastore_v3_stub(consistency_policy=self.policy)

        self.testbed.init_memcache_stub()
        self.testbed.setup_env(app_id='ndb-test')

    def tearDown(self):
        self.testbed.deactivate()

    def test1(self):

        test_model = TestModel()
        test_model.username = 'Tom'
        test_model._temp = 'Temporary'
        test_model.put()

        test = TestModel.query().fetch(10)

        self.assertEqual(1, len(test))

        test = test[0]

        self.assertEqual('Tom', test.username)
        self.assertEqual([], test._temp)

测试的最后一行 self.assertEqual([],test._temp)即使我希望它通过也会失败。

有没有办法不存储临时/辅助模型属性,或者每次从缓存加载模型时都有切割方法重置它们?

1 个答案:

答案 0 :(得分:4)

NDB有几个缓存 - 实例内存和内存缓存。在实例内存中,实际实体本身是高速缓存的,因此将在同一请求中为多个get调用返回相同的实体对象。

只要你在启用缓存时使用NDB,就必须要处理这个问题 - 例如,首先不要在实体上存储“临时”数据。