GAE ndb.JsonProperty()默认列表

时间:2014-09-22 15:14:29

标签: python json google-app-engine google-cloud-datastore app-engine-ndb

我有以下设置。为什么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']

为什么要打印出来['一个','两个']?我只给了它两个'。这是预期的行为吗?

1 个答案:

答案 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列表状态的副本。功能