2012-09-26 33 views
2

我有一個用戶ndb.Model有一個用戶名StringProperty,允許大寫小寫字母,在某些時候我想通過用戶名獲取用戶,但有必要的情況下,小寫的過濾。爲此我添加了一個ComputedProperty到用戶:ndb ComputedProperty過濾

@ndb.ComputedProperty 
    def username_lower(self): 
     return self.username.lower() 

然後我過濾查詢,像這樣:username_lower如下返回的用戶名的小寫版本

query = query.filter(User.username_lower==username_input.lower()) 

這工作,但它只做了用戶在之後創建(放)我將此添加到模型中。以前創建的用戶不會被此查詢過濾。我首先認爲ComputedProperty不適用於老用戶。但是,嘗試過這一點,並且對舊用戶調用.username_lower確實可行。

最後,我發現了一個解決方案是獲取所有用戶,只是運行一個.put_multi(ALL_USERS)

所以好像稍後添加到模型ComputedProperty當你調用它直但不工作首先過濾。它不會自動編入索引嗎?或者它可能是一個緩存的東西..?

任何瞭解爲什麼它表現得就像這將是受歡迎的

感謝

回答

4

這是預期的行爲。 ComputedProperty(或者我猜想的任何屬性)的值在對象被「put」時被索引。數據存儲不執行自動模式更新或類似的事情。在更新模式時,您需要在代碼中允許不同的模式版本,或者分別更新您的實體。在對索引進行更改的情況下,您別無選擇,只能更新您的實體。 MapReduce API可用於更新實體以避免請求限制等。

+0

好吧有道理,謝謝! – joplaete