我有以下设置。为什么JsonProperty的默认列表属性保留在其他实体中为其分配的先前值。我错过了什么吗?
class Item(ndb.Model):
foo = ndb.JsonProperty(default=[])
def add_to_foo(self, value):
self.foo.append(value)
return
item1 = Item()
item1.add_to_foo('one')
item1.put()
item2 = Item()
item2.add_to_foo('two')
item2.put()
print item2.foo # prints out ['one', 'two']
为什么要打印出来['一个','两个']?我只给了它两个'。这是预期的行为吗?
答案 0 :(得分:5)
是的,这是预期的行为 - 但为什么解释起来有点棘手。问题是您正在将list
实例传递给JsonProperty
初始化程序。此列表实际上是global
。所以,任何时候你得到"默认" foo
,您将获得全局实例 - 并且附加到它将随处追加。
这里的要点是不要将可变参数用作默认值。你最好重写add_to_foo
:
def add_to_foo(self, value):
if self.foo:
self.foo.append(value)
else:
self.foo = [value]
请注意,如果您将.get
项中的某个项目退出数据存储区,则会更加有趣。假设实体没有在本地缓存,那时他们就不会引用全局列表 - 只有.put
列表状态的副本。功能