如何使用django简单历史还原更改,特别是删除



我们为我们的模型设置了django-simple-history。最近,一大堆模特被神秘地删除了。这一点在事件发生几天后就被注意到了,所以最好避免进行完整的DB备份恢复,因为这会消除事后发生的手动更改。

我找不到任何方法来轻松恢复模型实例,特别是已删除的模型实例。我可以查询模型的历史版本,找到所有被删除的内容。有了这些,我还可以观察到,所有这些都有删除,这是它们最后的变化。我可以使用history-1上的instance属性来获取删除前的状态,但如果我试图保存它,它会出错,因为模型实例已被删除,不再存在。

那么,基本上,如果我有django简单历史的历史记录,那么恢复已删除的模型实例的最干净的方法是什么?如果可能的话,我想保留历史,所以在完全重新创建对象之前,我正在研究任何解决方案。

据我所知,问题是恢复一个已删除的模型实例,而不是类本身。所以卡尔的回答对这里没有帮助。要恢复已删除的实例,不能使用简单的历史记录。根据文档,简单历史记录只能恢复仍然存在的模型实例。由于您有数据库的完整备份,因此可以将此数据库导入django环境,从该备份数据库加载旧模型实例并将其保存到生产数据库(在django-shell中选择带有"using"的数据库)。请参阅此帖子。避免这种情况的最好方法是使用应用程序"反转"。使用这个django应用程序,您实际上可以恢复已删除的实例。请参阅文档。

如果模型使用django-simple-history,则

数据可以从历史模型中恢复。

我们需要从历史模型中筛选。例如,某个关键字或某个日期范围内的数据被意外删除。

例如,模型名称为Car,则默认情况下django-simple-history将创建一个历史模型作为HistoricalCar

historical_data = HistoricalCar.objects.filter(history_type='-')
for each in historical_data:
instance = each.instance  # This return instance of car.
instance.pk = None  # Create New Instance
instance.save()

你的意思是你的模型,而不仅仅是实例,已经被完全删除了吗?如果是这样的话,这可能意味着一些迁移将其删除

您可以尝试恢复迁移,然后从历史记录恢复。

模型的早期版本存储在_HISTORICAL<型号名称>桌子您可以执行一个简单的sql插入/选择查询,将该表中的数据复制回原始表中。下面这样的方法是可行的,但请检查数据库的sql语法是否正确。

insert into app_mymodel (col_a, col_b) 
select col_a, col_b from app_HISTORICALmymodel 
where id in (1,2,3...)

相关内容

最新更新