tl;dr - 修订并不是您“撤消”的事情。这是你恢复的东西。因此,撤消就是找到要撤消的事情之前发生的最新修订,并通过调用 revert() 来恢复它。
django-reversion 的数据模型基于修订和版本。修订版由一个或多个版本组成,版本代表一个 Django 模型的序列化状态。
django-reversion 允许您回滚到任何先前版本或修订版的状态。这类似于撤消功能,但不完全相同。
考虑以下工作流程:
# 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()
然而,在这种情况下,您将得到一个非常愚蠢的竞争条件,因为可以随时创建 SomeModel 的其他修订。