【问题标题】:ndb ComputedProperty filteringndb ComputedProperty 过滤
【发布时间】:2012-09-26 23:48:29
【问题描述】:

我有一个用户 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 似乎有效。它不会自动索引吗?或者它可能是一个缓存的东西..?

欢迎任何关于它为何如此行为的见解

谢谢

【问题讨论】:

    标签: app-engine-ndb


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      相关资源
      最近更新 更多