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