2

我有一个 User 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())

这有效,但是它仅适用于我将其添加到模型后创建(放置)的用户。之前创建的用户不会被此查询过滤。我首先认为 ComputedProperty 不适用于老用户。但是,尝试过这个并在老用户上调用 .username_lower 确实有效。

最后,我找到了一个解决方案是获取所有用户并运行 .put_multi(all_users)

因此,当您直接调用它但最初不过滤时,似乎稍后添加到模型中的 ComputedProperty 可以工作。它不会自动索引吗?或者它可能是一个缓存的东西..?

任何关于它为什么会这样表现的见解都将受到欢迎

谢谢

4

1 回答 1

4

这是预期的行为。当对象被“放置”时,ComputedProperty 的值(或我猜的任何属性)都会被索引。数据存储不执行自动模式更新或类似的操作。当您更新架构时,您需要在代码中允许不同的架构版本或单独更新您的实体。在索引更改的情况下,您别无选择,只能更新您的实体。MapReduce API可用于更新实体以避免请求限制等。

于 2012-09-27T22:30:50.667 回答