2012-12-18 32 views
4

如何在實體設置後測試NDB中未設置的重複屬性?如何測試NDB中未設置的重複屬性?

我能找到的唯一參考說:

查詢無在重複屬性的值具有不確定的行爲;不要這樣做。

+1

你是什麼意思「測試未設置」?你的意思是查詢實體在重複屬性中沒有特定值,或者在重複屬性中沒有值? –

+0

抱歉含糊不清的措辭。是的,我的意思是做相當於my_propery = null。 – wag2639

回答

8

如果你從不添加任何東西在重複的屬性列表的內容,沒有價值將被髮送,並且該屬性將顯示爲<missing>沒有<null>

據有關App Engine文檔Queries and Indexes,對屬性沒有值的實體和對它有空值的實體之間存在區別;和

沒有過濾屬性的實體從不返回查詢。

因此不可能爲這些舊記錄編寫查詢。

見上面引述的答案,其餘的爲
AppEngine: Query datastore for records with <missing> value

如果你想能夠查詢這樣的事情,你應該在你的數據模型執行此操作。例如,你可以有一個ndb.ComputedProperty,它是一個布爾值,對應於相應的列表是否具有長度零,例如

class MyModel(ndb.Model): 
    my_repeat = ndb.StringProperty(repeated=True) 
    sentinel = ndb.ComputedProperty(lambda self: len(self.my_repeat) == 0) 

,並查詢這些缺失值,你可以使用

MyModel.query(MyModel.sentinel == True) 

如果你有一個現有的集數據存儲區這樣的對象,你可以通過它們運行的​​一次性mapreduce和簡單使用更新的模型定義檢索每個實體,然後將每個實體放回到數據存儲中。這將保持所有現有屬性相同並使用sentinel值進行更新。

+0

是否有任何理由你使用裝飾器,而不是直接調用它sentinel = ndb.ComputedProperty(lambda self:len(self.my_repeat)== 0)? – wag2639

+0

沒有理由。代碼已更新。 – bossylobster

相關問題