2017-08-03 63 views
0

比方說,我在peewee模型:從數據庫還原peewee模型數據

inst = foo.get(id=1) 
print(inst.bar) #Prints 'ValueA' 

用戶更改模型:

class foo(Model): 
    id = PrimaryKeyField() 
    bar = TextField(null=True) 
    ... 

我從數據庫中獲取的foo實例值:

inst.bar = 'ValueB' 
#inst.save() has not been called 

現在用戶想要將inst還原爲值e目前在數據庫中。我想做到這一點:

​​

我看到最接近的事在一個事務中包裝的修改,但目前還不清楚該如何修改需要進行包裝。我測試了一下,交易不工作:

with database.atomic() as txn: 
    inst.bar = 'ValueB' 
    txn.rollback() 
    #I also tried database.rollback() and it didn't work 
print(inst.bar) #'ValueB' 

包裝紙調用save()在一個事務並調用rollback()防止被修改了數據庫,但是模型實例還包含了新的價值之後。

我將如何實現我的預期行爲?

回答

0

我通過跟蹤任何外部更改並僅在準備將更改提交到數據庫時將其應用於模型實例,從而間接解決了我的問題。變更跟蹤器的主要邏輯如下所示:

class ChangeTracker: 
    ... 
    def editRow(self,model,field,value): 
     if model not in self.changedRows: 
      self.changedRows[model] = {} 

     self.changedRows[model][field] = value 

    def commitChanges(self): 
     for model in self.changedRows: 
      for field in self.changedRows[model]: 
       value = self.changedRows[model][field] 
       setattr(model,field,value) 
      model.save()