8

我们已经django-simple-history为我们的模型设置了。最近一大堆模型被神秘地删除了。事后几天就注意到了这一点,因此最好避免完整的数据库备份恢复,因为这会清除事后发生的手动更改。

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

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

4

4 回答 4

1

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

于 2019-03-14T10:36:22.693 回答
0

如果模型使用django-simple-historythen,

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

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

例如。模型名称为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()

于 2022-01-21T14:20:57.017 回答
0

你的意思是你的模型,而不仅仅是实例,已经被完全删除了吗?如果是这种情况,则可能意味着某些迁移将其删除。

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

于 2018-04-14T09:31:09.433 回答
0

模型的先前版本存储在 _HISTORICAL<model_name> 表中。您可以执行一个简单的 sql 插入/选择查询,将该表中的数据复制回原始表中。像下面这样的东西会起作用,但请检查您的数据库的正确 sql 语法。

insert into app_mymodel (col_a, col_b) 
select col_a, col_b from app_HISTORICALmymodel 
where id in (1,2,3...)
于 2020-10-02T13:08:52.827 回答