3

我遇到了一個奇怪的問題。我想我不是在replication issue的情況下,但類似的東西。對計算屬性的NDB查詢未正確評估

我這個模型具有計算性能

status = ndb.ComputedProperty(lambda self: self._compute_status()) 
... 
    def _compute_status(self): 
     if self.canceled: 
      return "CANCELED" 
     course = self.course.get().course_type 
     if course == "SCHEDULED": 
      now = datetime.now() 
      if now < self.start_date: 
       return "UPCOMING" 
      elif now > self.end_date: 
       return "FINISHED" 
     return "ONGOING" 

現在,我查詢所有的模型和我做這兩個打印

print sessions[0] 
print sessions[0].status 

結果表明不同勢值:

Session(key=Key('Session', 5302669702856704), canceled=False, course=Key('Course', 6605041225957376), created=datetime.datetime(2015, 5, 5, 13, 39, 56, 86329), day_no=None, end_date=datetime.datetime(2015, 5, 8, 9, 35), meta_data=None, name=u'asd', profile=None, session_type=u'JOINT', start_date=datetime.datetime(2015, 5, 7, 8, 50), status='UPCOMING', url=u'', week_no=None) 
FINISHED 

第一次打印status=ONGOING而第二次打印的是FINISHED,因爲它應該是今天之後的end_date

這對查詢有影響,因爲如果我查詢status=='FINISHED'它不會返回正確的結果集合。

有什麼想法?

編輯:

事實上的文檔說:

注意:ComputedProperties不相當對 的put()計算的查詢,但。如果您更新模型的模式以包含ComputedProperty,您應該記住通過加載並將 加載到數據存儲來更新現有實體。有關更多 信息,請參閱更新您的型號的架構。

但是,那麼,我該如何執行查詢?我必須通過「手」來過濾它們嗎?

回答

3

您必須通過datetime屬性進行查詢,因爲當您將此實體放入數據存儲庫時 - 該值是基於當前時間計算的,並且在查詢時 - 舊值仍然使用,但值爲在您觸摸此屬性時重新計算。