首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django-reversion undo功能-恢复多个对象

django-reversion undo功能-恢复多个对象
EN

Stack Overflow用户
提问于 2013-03-22 22:24:41
回答 2查看 4.1K关注 0票数 3

我正在尝试在django项目中使用django-reversion实现'undo‘功能,以防用户意外修改多个对象。使用管理面板将不起作用,因为必须一个接一个地还原对象。

我的问题是我无法创建包含多个对象数据的修订。

即使我这样做了

代码语言:javascript
复制
with reversion.create_revision():
    Res.object.all().delete()

则我无法访问分组此更改的修订。它以"one object one revision.models.Version“的方式拆分。

代码语言:javascript
复制
In [103]: reversion.models.Version.objects.all()
Out[103]: [<Version: #00001>, <Version: #00002>]

我也试过了

代码语言:javascript
复制
reversion.models.Revision.objects.all().order_by('-date_created')[0].version_set.all()

但它也只为一个已删除的Res对象返回一个版本。我好像漏掉了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-26 01:32:04

我终于明白了。

问题1:在单个修订中存储与多个对象相关的更改

解决方案:向MIDDLEWARE_CLASSES添加TransactionMiddleware

问题2:撤消功能/恢复更改

好吧,这很让人困惑。您无法将对象还原更改,您可以将恢复到以前已知的状态。在更改对象的视图中使用reversion.create_revision()可以在更改之后存储有关该对象的数据。如果您查看了modify multiple object,则必须在进行实际更改之前创建revision

这也可以在管理面板中看到。如果您更改对象,则会出现一个新的日志条目。但是,如果您想恢复该更改,则不能选择最新版本--它与对象的当前状态相同--而必须选择上一个版本。

票数 1
EN

Stack Overflow用户

发布于 2013-03-23 22:35:03

tl;dr -A修订不是你可以“撤销”的。这是你可以恢复的东西。因此,撤销就是找到在要撤销的事情之前发生的最新修订,并通过调用revert()恢复它。

django-reversion的数据模型基于修订和版本。一个修订版由一个或多个版本组成,一个版本代表一个Django模型的序列化状态。

django-reversion允许您回滚到任何先前版本或修订的状态。这与撤消功能类似,但与撤消功能不同。

请考虑以下工作流程:

代码语言:javascript
复制
# Create a Revision containing two Versions.
with reversion.create_revision():
    a = SomeModel.objects.create(name="A version 1")
    b = SomeModel.objects.create(name="B version 1")

# Create a Revision containing to Versions.
with reversion.create_revision():
    a.name = "A version 2"
    a.save()
    b.name = "B version 2"
    b.save()

此时,您可以通过恢复到上一次修订来“撤消”第二次编辑。

代码语言:javascript
复制
# Revert just 'a' to version 1. This is the last but one revision.
reversion.get_for_object(a)[1].revert()

# Or, revert 'a' and 'b' to version 1.
reversion.get_for_object(b)[1].revision.revert()

您也可以像这样删除和恢复:

代码语言:javascript
复制
# Store the pk of 'a', then delete it.
a_pk = a.pk
a.delete()

# Recover 'a' via it's primary key.
reversion.get_deleted(SomeModel).filter(object_id=a_pk).revert()

因此,您可以恢复到单个模型或保存在一起的一组模型的以前状态。然而,没有办法说“撤销我刚刚做的事情”。取而代之的是,你必须告诉reversion“变得像你现在这样”。

在您的示例中,如果您想撤消批量删除,可以这样做:

代码语言:javascript
复制
# Save a revision containing all SomeModel instances.
with reversion.create_revision():
    for obj in SomeModel.objects.all():
        obj.save()

# Delete them all.
SomeModel.objects.delete()

# Revert back to the previous revision, where nothing was deleted.
Revision.objects.filter(version__content_type=ContentType.objects.get_for_model(SomeModel)).order_by("-date_created")[0].revert()

然而,在这种情况下,您将得到一个非常愚蠢的竞争条件,因为可以在任何时候创建SomeModel的其他修订。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15572746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档