2017-08-03 8 views
0

はのは、私はピーウィーでモデルを持っているとしましょう値:データベースからのデータにピーウィーモデルを元に戻す

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

今、ユーザーが戻ってVALUにinstを戻したいです現在データベースに入っています。私はこれを実現したいと思います:私が見た

​​

最も近いものは、トランザクションでラップの修正ですが、変更がラップする必要があるかは不明です。私は少しをテストし、トランザクションは動作しません:

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() 
関連する問題