不要在模型上发射保存

时间:2011-06-19 21:07:17

标签: django django-models

我正在django中构建应用程序,我决定添加历史记录以跟踪模型中数据的更改。我正在使用django-simple-history来实现这一目标。该软件包显然会在post_save信号上保存历史记录。

我希望能够在不保存历史记录的情况下保存对象,例如当我运行一些后台查询并需要保存数据时。我的问题是,“我可以阻止模型发出保存后信号”

我目前有一个解决方法。我有一个布尔变量,当我想显示该记录的历史记录时,我将其设置为True。但这并不妨碍创建历史记录。

感谢你。

2 个答案:

答案 0 :(得分:2)

我对信号不太热,但我认为你应该改变信号处理程序,而不是停止发出信号。如果您在保存模型后需要执行其他一些不相关的操作,该怎么办?

尝试在django-simple-history / simple_history / models.py中修补create_historical_record(),将以下代码段放在顶部:

create_historical_record(self, instance, type):
    if hasattr(instance, 'save_history') and not instance.save_history:
        return
    #rest of method

您还可以尝试暂时断开历史跟踪器与模型实例的连接,然后重新连接它,但我不知道您在哪里这样做。它也可能更容易出错。

哦,是的,你也可以继承HistoricalRecords:

class OptHistoricalRecords(HistoricalRecords):
    def create_historical_record(self, instance, type):
        if hasattr(instance, 'save_history') and not instance.save_history:
            return
        else:
            super(OptHistoricalRecords,self).create_historical_record(instance,type)

答案 1 :(得分:0)

有一种方法可以使用contribute_to_class为模型做出贡献,其名称为save_without_historical_record

obj.some_field = new_value
obj.save_without_historical_record()
...
# now create a record.
obj.save()