【问题标题】:How to revert changes, specifically deletions, with django-simple-history如何使用 django-simple-history 恢复更改,特别是删除
【发布时间】:2017-01-18 23:11:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: django django-simple-history


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您的模型的先前版本存储在 _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...)
        

        【讨论】:

          【解决方案4】:

          如果模型使用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()
          
          

          【讨论】:

            猜你喜欢
            • 2020-10-07
            • 1970-01-01
            • 2011-07-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-20
            • 2020-09-29
            • 2013-01-13
            相关资源
            最近更新 更多