我创建了一种非常简单的方式来存储Django模型的历史记录:
class Estimate(Model):
date = models.DateField(default=timezone.now)
amount = models.DecimalField(max_digits=11, decimal_places=2, default=0.00)
def makeHistory(self):
history = new EstimateHistory()
history.date = self.date
history.amount = self.amount
history.last_mod_date = timezone.now()
history.last_mod_user = 'username'
class EstimateHistory(Model):
# Same fields as Estimate...
date = models.DateField(default=timezone.now)
amount = models.DecimalField(max_digits=11, decimal_places=2, default=0.00)
# ...with two more added as History metadata
last_mod_date = models.DateTimeField("last modified date")
last_mod_user = 'username'
我已覆盖save()
的{{1}}方法,为此:
Model
这似乎工作得很好,除了存储历史记录的整个要点是在保存对象之前存储值。
我正在使用管理页面对此进行测试,但如果我更改了
def save(self, *args, **kwargs):
try:
# Is there a history table? Save off the object in it.
historyObject = self.makeHistory() # <-- Line A
print "Saving " + str(type(self)) + ", in a history table"
super(Model, self).save(*args, **kwargs)
historyObject.save()
except AttributeError:
print "Saving " + str(type(self)) + ", but not in a history table"
super(Model, self).save(*args, **kwargs)
except Error:
print "Not even saving. Something went wrong."
raise
到
Date: 2015-01-01
Estimate: 1500.00
在上面第A行的Date: 2015-01-01
Estimate: 1700.00
来电期间,self.amount
的值为1700.00。也就是说,管理页面正在更改当前加载的模型,之后它将保留在数据库中。
如何在管理页面中进行更改之前获取模型的原始内容,以便将其保留在历史记录表中?使用上面的示例,我希望makeHistory()
中的amount
字段为1500.00,而不是1700.00。
我是Django(甚至是Python)的新手,所以请保持温和。
答案 0 :(得分:1)
我认为通常的方法是使用模型__init__()
来记住那里有什么价值。像这样(没有测试的粗略例子):
class Estimate(Model):
def __init__(self, *args, **kwargs):
super(Estimate, self).__init__(*args, **kwargs)
# use a different name to record what the old value is
self.initial_amount = self.amount
def make_history(self):
old_value = self.initial_amount
new_value = self.amount
# etc etc
我并不特别喜欢记录上述历史的方式,因为它很麻烦,每次跟踪历史记录时都必须写这样的东西。对于我自己的项目,我使用django-simple-history,它很容易用于跟踪历史记录。你不需要做我上面提到的任何事情,你可以跟踪你想要的任何模型历史。