修改Django管理页面上的操作顺序以填充历史表

时间:2015-09-02 14:38:40

标签: django django-admin

我创建了一种非常简单的方式来存储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)的新手,所以请保持温和。

1 个答案:

答案 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,它很容易用于跟踪历史记录。你不需要做我上面提到的任何事情,你可以跟踪你想要的任何模型历史。