大文字と小文字を許可するユーザー名 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 は、直接呼び出すと機能するように見えますが、最初はフィルタリングされません。自動的にインデックスされませんか? またはそれはキャッシングのことでしょうか..?
なぜこのように振る舞ったのかについての洞察は大歓迎です
ありがとう