让我们说我在peewee有一个模特:
class foo(Model):
id = PrimaryKeyField()
bar = TextField(null=True)
...
我从数据库中获得foo
的实例:
inst = foo.get(id=1)
print(inst.bar) #Prints 'ValueA'
用户更改模型的值:
inst.bar = 'ValueB'
#inst.save() has not been called
现在,用户希望将inst
还原为当前数据库中的值。我想做到这一点:
print(inst.bar) #Prints 'ValueB'
#Some function that reverts to the database
print(inst.bar) #'ValueA'
我看到的最接近的事情是在事务中包装修改,但不清楚修改是如何被包装的。我测试了一下,交易不起作用:
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 :(得分: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()