我有一个用户ndb.Model,它有一个用户名StringProperty,允许使用大写字母小写字母,在某些时候我想通过用户名获取用户,但是大小写被强制为小写进行过滤。为此我向User:username_lower添加了一个ComputedProperty,它返回用户名的小写版本,如下所示:
@ndb.ComputedProperty
def username_lower(self):
return self.username.lower()
然后我像这样过滤查询:
query = query.filter(User.username_lower==username_input.lower())
这是有效的,但它只适用于之后创建(put)的用户我将其添加到模型中。之前创建的用户不会被此查询过滤。我首先认为ComputedProperty不适合老用户。但是,尝试过此操作并在旧用户上调用.username_lower确实有效。
最后,我发现解决方法是获取所有用户并运行.put_multi(all_users)
因此,当您直接调用模型时,似乎稍后添加的ComputedProperty会起作用,但最初不会过滤。是不是自动编入索引?或者它可能是一个缓存的东西..?
对于为什么表现得像这样的任何见解都会受到欢迎
感谢
答案 0 :(得分:4)
这是预期的行为。当对象被“放置”时,ComputedProperty(或我猜的任何属性)的值被索引。数据存储区不会执行自动架构更新或类似的任何操作。更新架构时,您需要在代码中允许不同的架构版本或单独更新实体。在更改索引的情况下,您别无选择,只能更新实体。 MapReduce API可用于更新实体以避免请求限制等。