2014-06-06 87 views
1

我正在努力與KeyProperty查詢,並不能看到有什麼問題。ndb通過KeyProperty查詢

我的模型是

class MyList(ndb.Model): 
    user = ndb.KeyProperty(indexed=True) 
    status = ndb.BooleanProperty(default=True) 
    items = ndb.StructuredProperty(MyRef, repeated=True, indexed=False) 

創建MYLIST的實例與相應的數據,並可以運行下面的正確

cls = MyList 
lists = cls.query().fetch() 

返回

[MyList(key=Key('MyList', 12), status=True, items=..., user=Key('User', 11))] 

但它失敗時,我嘗試按用戶進行過濾,即查找用戶等於特定實體的列表;即使使用我剛剛用於插入的一個,或從前一個查詢結果。

key = lists[0].user 
lists = cls.query(cls.user=key).fetch() 

返回

[] 

但工作正常status=True作爲過濾器,我看不到缺少了什麼?

我要補充它在一個單元測試環境將發生在以下v3_stub

self.policy = datastore_stub_util.PseudoRandomHRConsistencyPolicy(probability=0)         
self.testbed.init_datastore_v3_stub(                    
    require_indexes=True,                      
    root_path="%s/../"%(os.path.dirname(__file__)), 
    consistency_policy=self.policy 
) 
+1

這是最終一致性的產物。它在SDK中被模擬,並且在使用SDK進行測試時,您有幾個關於如何模擬的選擇。事實證明,你知道你可以檢索實體,所以它存在。關閉開發環境中最終的一致性作爲另一項檢查。但是你必須在你的設計中處理這個問題。 –

+0

@TimHoffman:這是正確的,如果我設置概率= 1,它工作正常,謝謝!然而,我不明白爲什麼query()w/o參數可以工作,還有另一個過濾器(例如status = True)。這是否意味着,由於最終一致性,索引尚未創建?我認爲最終一致性狀態是「全部或全部」,而不是「中間」,就像在這種情況下,只有一些索引返回正確的數據。這是一個錯誤? – apassant

+0

我相信每個索引都可以在自己的時間更新。但是,您正在使用SDK,它至多是真實環境的近似值。您應該編寫代碼來處理SDK最終的行爲,因爲這可能是最糟糕的情況。如果你的設計可以解決這個問題,那麼你可以處理生產。另一方面,如果您的設計只在設定概率= 1時才起作用,那麼您處於滑坡並且在生產中會遇到問題。 –

回答

0

user=Key('User', 11)是不同類的關鍵:User。不MyList

也許你的意思是:

user = ndb.KeyProperty(kind='User', indexed=True) 
+0

關於不同的類,我試圖找到鑰匙是'User'實體,而不是'MyList'的值 - 我已經編輯了這個問題來說明這一點。我也嘗試kind ='用戶',同樣的問題 – apassant