有没有办法访问django-reversion对象,就像它是当前对象一样?

时间:2015-06-11 09:35:37

标签: python django django-reversion

我正在使用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

2 个答案:

答案 0 :(得分:3)

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

似乎获取完整实例(包括关系数据)的唯一方法是启动事务,还原修订,执行您需要执行的操作并撤消事务,如作者所述:{{3} }。

答案 1 :(得分: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()

如果您在保存主要对象时没有实际保存相关对象,因此相关对象不属于修订版,那么是的,您需要沿着兔子洞进行修改相关对象的位置与主对象修订日期相同(这是一个相当复杂的查询)。