2013-05-06 17 views
2

我想有這樣的方法:是否有可能事務上突變GAE實體?

class Counter(db.Model): 
    n = db.IntegerProperty() 

    @db.transactional 
    def increment(self): 
    entity = db.get(self.key()) 
    entity.n += 1 
    self.n = entity.n 
    db.put(entity) 

除了在礦山,可以有相當多的更多屬性參與,有點邏輯的周圍哪些時得到更新。在'自我'集上每次更改'實體'後,似乎都是多餘且容易出錯的。

我可以以某種方式做到這一點,而不必明確更新每個self.{prop}的變化的屬性?想到.properties().dynamic_properties()。實體是否有可能需要同步的其他任何狀態?

+0

不確定你的意思是不「明確更新」屬性。當你更新財產時,任何「邏輯」都會被照顧,當然?你能舉一個你想要發生什麼的例子嗎? – 2013-05-06 22:00:39

+0

我不得不問,爲什麼你要在增量方法中取得實體,如果你有'self.key()',那麼你已經有了這個對象。我認爲你需要考慮你實際上想要達到的目標以及你如何去做。 – 2013-05-08 01:24:38

+0

@TimHoffman我想以事務方式更新它。 – 2013-05-08 04:19:29

回答

2

要麼運行此方法作爲@classmethod(沒有自我),或跳過「得到」。一旦你有了「自我」,就沒有必要去了。

@staticmethod:

class Counter(db.Model): 
    n = db.IntegerProperty() 

    @staticmethod 
    @db.transactional 
    def increment(key): 
    entity = db.get(key) 
    entity.n += 1 
    db.put(entity) 

這樣你就可以避免爲自我而指的是同一實體的變量。

如果您仍然傾向於使用counter.increment()而不是Counter.increment(counter.key()),另一種有效方法是在調用方法中啓動事務。

class Counter(db.Model): 
    n = db.IntegerProperty() 

    def increment(self): 
    self.n += 1 
    db.put(entity) 

# Wherever the code is using Counter. 
@db.transactional 
def main_method(key): 
    entity = db.get(key) 
    entity.increment(() 

我想這兩個主要信息建議:

  • 避免使用自我引用和相同的方法來實體的引用。當你認爲這是一種'難聞的氣味'模式時,你是對的。
  • 考慮使用ndb而不是db。這是一個很好的數據庫演變,並與您當前存儲的對象兼容。
+0

我想做counter.increment()而不是Counter.increment(counter.key())。 – 2013-05-20 20:10:53

+1

(當我只是想幫忙時不需要用'-1'來懲罰,而且技術上的答案是正確的) http://stackoverflow.com/privileges/vote-down – 2013-05-20 20:32:19

+0

對不起。隨意進行編輯,以便我可以不降低投票率。 – 2013-05-20 23:45:30

相關問題