Google app engine NDB缓存临时/辅助程序属性。我能把它关掉吗?

Google app engine NDB缓存临时/辅助程序属性。我能把它关掉吗?,google-app-engine,app-engine-ndb,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 imp

看起来在使用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.\u temp)失败,即使我希望它通过


是否有一种方法可以不存储临时/辅助模型属性,或者在每次从缓存加载模型时使用解理器方法重置它们?

NDB有两个缓存—实例内存和memcache。在实例内存中,实际实体本身被缓存,因此同一请求中的多个get调用将返回同一实体对象


只要您在启用缓存的情况下使用NDB,您就必须解决这一问题—例如,首先不要在实体上存储“临时”数据。

NDB有两个缓存—实例内存和memcache。在实例内存中,实际实体本身被缓存,因此同一请求中的多个get调用将返回同一实体对象


只要您在启用缓存的情况下使用NDB,您就必须解决这一问题—例如,首先不要在实体上存储“临时”数据。

您是否100%确定它们已缓存?Ndb仅按键(key.get())缓存实体,不应缓存任何“helper”变量(以下划线开头)。如果我运行您的代码,创建新实体,填写_临时列表并放置它,ndb不会存储任何这些值。您能描述一下您是如何测试它的,以及您是如何得到缓存结果的吗?谢谢您的回复。请查看我的编辑。您是否100%确定它们已缓存?Ndb仅按键(key.get())缓存实体,不应缓存任何“helper”变量(以下划线开头)。如果我运行您的代码,创建新实体,填写_临时列表并放置它,ndb不会存储任何这些值。您能描述一下您是如何测试它的,以及您是如何得到缓存结果的吗?谢谢您的回复。请看我的编辑。谢谢你的回复。GAE文档中说:“属性的名称用作实体上相应属性的名称。名称以下划线(_)开头的模型实例属性将被忽略,因此应用程序可以使用这些属性存储未保存到数据存储的模型实例上的数据。”因此,我认为在使用上下文缓存时也应该忽略它们,但事实并非如此。我正在寻找一种解决方案,以便在从上下文缓存中检索实体时“清除”它们。NDB缓存不是将内容存储到数据存储中,而是将内容缓存到内存中。因为它是同一个实例,所以在不了解您的模型的细节的情况下,它无法进入并清除内容。无论您在这里存储什么,首先几乎肯定不会与模型相关联。“NDB缓存不是将内容存储到数据存储中,而是将内容缓存在内存中。”-我知道这一点。我的问题的部分答案可以在这里找到:这里:我的观点是文档的这一部分是不相关的——它指的是实体如何存储在数据存储中,而不是NDB如何缓存它们。此外,NDB在文档中解释了它是如何缓存的。禁用缓存是对此的一种极端反应,会影响性能-最好将这些“临时”属性移出模型,或者自己清除它们。这些属性的性质是什么?我在模型中添加了一些临时/辅助属性,并添加了一些属性设置器,这样我可以跟踪哪些属性发生了更改,然后使用这些信息来更新一些分片计数器,这些计数器保存有关数据存储中数据的统计信息。正如您所指出的,解决方案是不在模型中保存此数据。谢谢谢谢你的回复。GAE文档中说:“属性的名称用作实体上相应属性的名称。名称以下划线(_)开头的模型实例属性将被忽略,因此应用程序可以使用这些属性存储未保存到数据存储的模型实例上的数据。”因此,我认为在使用上下文缓存时也应该忽略它们,但事实并非如此。我正在寻找一种解决方案,以便在从上下文缓存中检索实体时“清除”它们。NDB缓存不是将内容存储到数据存储中,而是将内容缓存到内存中。因为它是同一个实例,所以在不了解您的模型的细节的情况下,它无法进入并清除内容。无论您在这里存储什么,首先几乎肯定不会与模型相关联。“NDB缓存不是将内容存储到数据存储中,而是将内容缓存在内存中。”-我知道这一点。我的问题的部分答案可以在这里找到:这里:我的观点是文档的这一部分是不相关的——它指的是实体如何存储在数据存储中,而不是NDB如何缓存它们。此外,NDB在文档中解释了它是如何缓存的。禁用缓存是对此的一种极端反应,会影响性能-最好将这些“临时”属性移出模型,或者自己清除它们。这些属性的性质是什么?我在模型中添加了一些临时/辅助属性,并添加了一些属性设置器,这样我可以跟踪哪些属性发生了更改,然后使用这些信息来更新一些分片计数器,这些计数器保存有关数据存储中数据的统计信息。正如您所指出的,解决方案是不在模型中保存此数据。谢谢