2012-09-09 64 views
0

我有幾個關於NDB投影查詢的工作和緩存的行爲場景NDB投影和緩存問題

因此,考慮類似的模型背後的疑惑:

class Users(ndb.Model): 
    user_name = ndb.StringProperty(required=True) 
    user_email = ndb.StringProperty(required=True) 
    user_password = ndb.StringProperty(required=True) 

    @classmethod # THIS ONE DOES NOT WORK 
    def get_profile_info(cls, id): 
     return ndb.Key(Users, id).get(projection=[Users.user_name]) 

    @classmethod # THIS ONE WORKS 
    def get_profile_info(cls, id): 
     return Users.query(Users.key == ndb.Key(Users, id)).get(projection=[Users.user_name]) 

爲什麼第一classmethod引發「TypeError:未知配置選項('投影')」?我不能簡單地直接調用一個鍵的投影,而不必查詢一個鍵嗎?

第二,關於緩存,我不知道如果我理解正確的這個線程:NDB Caching When Using Projected Queries

不投影查詢緩存?這是否意味着它更好地簡單地調用一個get()(並獲取整個實例),使其被緩存,而不是投影?

在此先感謝!

回答

2

根據錯誤使用get時,投影沒有任何意義。從文檔「它只獲取投影中這些屬性的值,它從查詢索引獲取這些數據(因此投影中的屬性必須編入索引)」。所以get不會通過索引訪問對象屬性。請注意gvr對引用問題中的緩存發表的評論。

+0

好的,也許我對指數有一個誤解。沒有使用Key()。get()使用GAE Keys的索引獲取實例? 例如:Key(Users,1).get()會獲取ID = 1的用戶的整個實例。是不是來自包含Keys的索引? –

+0

投影屬性從索引中檢索。即投影中的所有屬性都必須有索引。 –

+0

Key(Users,1).get()將直接從實體表中獲取實體,而不進行任何索引查找。 – proppy