2

大文字と小文字を許可するユーザー名 StringProperty を持つユーザー ndb.Model があります。ある時点で、ユーザー名でユーザーを取得したかったのですが、フィルタリングのために大文字と小文字を強制的に区別しました。そのため、次のように小文字バージョンのユーザー名を返す 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 に答える