0

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)の最後の行は、合格すると予想しても失敗します。

一時/ヘルパーモデルのプロパティを保存しない方法や、モデルがキャッシュから読み込まれるたびにそれらをリセットするクリーバーの方法はありますか?

4

1 に答える 1

4

NDBには、インスタンスメモリとmemcacheの2つのキャッシュがあります。インスタンスメモリでは、実際のエンティティ自体がキャッシュされるため、同じリクエスト内の複数のget呼び出しに対して同じエンティティオブジェクトが返されます。

キャッシュを有効にしてNDBを使用している限り、これは、たとえば、最初にエンティティに「一時的な」データを保存しないことによって対処する必要があるものです。

于 2012-10-04T09:50:23.760 に答える