我对名称空间在App Engine(python)中的工作方式感到很困惑。我已阅读https://developers.google.com/appengine/docs/python/multitenancy/multitenancy#Using_Namespaces_with_the_Datastore并遵循其建议,但为什么此代码有效?它不应该在“get”中使用“current”命名空间吗?
namespace_manager.set_namespace("foo")
t = model.Track(description="in foo namespace")
t.put()
namespace_manager.set_namespace("bar")
# Why doesn't this line fail?
x = model.Track.get(t.key())
x.delete()
答案 0 :(得分:3)
命名空间是密钥的一部分。
只有在未明确指定另一个命名空间时,才会考虑使用命名空间管理器定义的命名空间,例如:在创建新实体时。换句话说,当生成新密钥时,您使用namespace_manager.set_namespace设置的名称空间将注入密钥。从那时起,密钥包含关于" location"的完整信息。实体(甚至是app id),它足以检索它。
阅读https://developers.google.com/appengine/docs/python/datastore/keyclass#Key_namespace