Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django恢复撤消功能-恢复多个对象_Python_Django_Undo_Django Reversion - Fatal编程技术网

Python django恢复撤消功能-恢复多个对象

Python django恢复撤消功能-恢复多个对象,python,django,undo,django-reversion,Python,Django,Undo,Django Reversion,我试图在django项目中使用django反转实现“撤销”功能,以防用户可能意外修改多个对象。使用管理面板将无法工作,因为必须逐个还原对象 我的问题是无法创建包含多个对象数据的修订。 即使我这样做了 with reversion.create_revision(): Res.object.all().delete() 然后,我无法访问将此更改分组的修订。它以“一个对象一个版本.模型.版本”的方式进行拆分 但对于一个已删除的Res对象,它也只返回一个版本。 好像我错过了什么。tl;dr-

我试图在django项目中使用django反转实现“撤销”功能,以防用户可能意外修改多个对象。使用管理面板将无法工作,因为必须逐个还原对象

我的问题是无法创建包含多个对象数据的修订。
即使我这样做了

with reversion.create_revision():
    Res.object.all().delete()
然后,我无法访问将此更改分组的修订。它以“一个对象一个版本.模型.版本”的方式进行拆分

但对于一个已删除的Res对象,它也只返回一个版本。
好像我错过了什么。

tl;dr-修订不是你“撤销”的东西。这是你恢复的东西。因此,撤消是指查找要撤消的内容之前发生的最新修订,并通过调用revert()将其还原。

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

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

考虑以下工作流:

# 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()
此时,您可以通过恢复到上一版本来“撤消”第二次编辑

# 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()
您也可以这样删除和恢复:

# 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()
因此,可以恢复到单个模型或一起保存的一组模型的先前状态。然而,没有办法说“撤销我刚才所做的”。相反,你必须告诉回归“变得像你此时的样子”

在您的情况下,如果要撤消批量删除,可以这样做:

# 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()
然而,在这种情况下,您将得到一个非常愚蠢的竞争条件,因为可以在任何时候为某个模型创建其他版本。

我终于得到了它

第1期:将与多个对象相关的更改存储在一个修订版中

解决方案:将TransactionMiddleware添加到中间件类

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

嗯,这让人困惑。您不能还原更改您可以将对象还原到以前已知的状态。并在对象更改视图中使用reversion.create_revision()在更改对象后存储有关该对象的数据。如果您有修改多个对象的视图,则必须在进行实际更改之前创建修订


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

我仍然无法获得将批量更改分组到模型实例的修订。我尝试了您的工作流,将实例保存到修订版中,然后对其执行delete()——我为每个模型获得一个修订版,而版本集仅对相关模型进行分组。道歉。。。我输入错误,我已经修改了。感谢您的澄清,但是,通过内容类型过滤器获取修订不会导致将更改分组到多个模型实例的修订。我只剩下一个实例一个修订版本,并考虑对修订/版本进行一些基于哈希/时间戳/用户名的注释,将它们组合在一起。
# 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()
# 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()