2010-11-05 45 views
2

使用pyE版GAE並從db.Model擴展模型,如何獲取屬性等於None或不存在的實體?在Google App Engine中,如何選擇屬性不存在的實體?

#This works 
#Fetch 10 entities where duration == 0.0 
entities = MyModel.all().filter('duration = ', 0.0).fetch(10) 

#This doesn't. How can I do the equivalent? 
#Fetch 10 entities where duration == None 
entities = MyModel.all().filter('duration = ', None).fetch(10) 

回答

3

您沒有duration屬性(無法過濾,因爲索引無法引用它們)的實體以及duration設置爲無(可以過濾)的實體。

既然你已經改變MyModel模式,你應該可以解決存儲,而不duration財產的是這樣的實體:

entities = MyModel.all() 
for entity in entities : 
    if not entity.duration : 
    entity.duration = None 
    entity.put() 

,看一下appengine-mapreduce庫來完成這個長時間運行的任務。

+0

我正在尋找一種方法來僅查找缺少持續時間屬性的實體。你認爲唯一的方法是首先在每個實體上創建持續時間=無?提前致謝。 – Chris 2010-11-05 14:22:44

+1

由於您的實體已正確更新,因此您可以使用Query類從Datastore中獲取它們(使用duration = None)。沒有這個修復,我認爲你只能使用笨重的檢查「如果不是entity.duration:..」。 – systempuntoout 2010-11-05 15:22:28

0

我認爲通常的做法是將一個布爾標誌字段添加到您的模型並對其進行過濾。在你的情況,這將是像

class MyModel(db.Model): 
    duration = db.FloatProperty() 
    has_duration = db.BooleanProperty(default=False) 
    # ... etc ... 

在那裏你可以接着用

entities = MyModel.all().filter('has_duration = ', False).fetch(10) 

做你的第二個查詢你必須照顧到更新has_duration場創建/編輯實體,但是。

+4

這不是必須的:一旦實體與新定義一起存儲,您可以在duration = None上過濾;在他們更新之前,他們也沒有新的'has_duration'標誌。 – 2010-11-05 14:47:16

+0

啊,我想我稍微誤解了這個問題。 – 2010-11-05 15:01:29

相關問題