1

我正在使用 Django-Reversion - 有没有办法临时恢复对象的先前版本,以便可以在 DetailView 中查看它?

非工作代码 -version.get_object()会很好..

class ProductDetailView(DetailView):

    def get_object(self):
        obj = super(ProductDetailView, self).get_object()
        if self.request.GET.get('v') is not None:
            version_id = force_text(self.request.GET.get('v'))
            version = get_object_or_404(Version, pk=version_id, object_id=force_text(obj.pk))
            return version.get_object()
        return obj
4

2 回答 2

3

我想你的问题已经解决了,但为了记录,你可以使用 访问实例version._object_version.object,但它将具有最新版本的反向关系信息。

似乎获得包括关系数据在内的完整实例的唯一方法是启动事务,恢复修订,做你需要做的任何事情并撤消事务,正如作者在此处所述:https ://groups.google .com/d/msg/django-reversion/FIi8smbLGEc/BvLN20p4HAAJ

于 2016-07-26T13:02:10.020 回答
1

从我的帖子复制@ http://spapas.github.io/2015/01/21/django-model-auditing/#using-django-reversion

[...] 每个版本都有revision对应修订的属性,可用于执行以下操作:

  • revision.user获取通过属性进行更改的用户
  • revision.date_created通过属性获取更改日期
  • field_dict使用属性获取对象字段的值,就像它们在此修订版中一样
  • object_version.object使用属性获取模型实例,因为它在该版本上
  • revert()使用该方法恢复到该对象的先前版本

因此,尝试将您的return version.get_object()线路更改为 return version.object_version.object!

更新以回答 OP 对相关对象的评论:django-reversion 支持对模型进行分组更改的修订——从http://django-reversion.readthedocs.org/en/latest/api.html#creating-revisions复制

修订代表对模型所做的一项或多项更改,它们组合在一起作为一个单元。您可以通过标记一段代码来表示修订来创建修订。每当您在修订范围内的模型上调用 save() 时,它将被添加到该修订中。

因此,如果您在单个 POST 请求中更改所有模型,则可以将其添加到修订中,以使所有更改的对象成为该修订的成员。之后,当您拥有对象的一个​​版本时,您可以使用它的 reversion 来获取属于同一修订的所有对象的所有版本:version.revision.version_set.all().

如果您在保存主要对象时并没有实际保存相关对象,因此相关对象不属于修订版,那么是的,您需要进入兔子洞并按原样获取相关对象的修订版在主要对象修订日期(这是一个相当复杂的查询)。

于 2015-06-11T09:43:06.913 回答