如何为django-reversion历史对象提供视图?

时间:2015-02-23 16:44:20

标签: django django-reversion

django reversion的管理集成非常简单。 当我访问127.0.0.1/admin时,我可以选择让员工用户恢复已删除的对象或查看以前的版本。

但这只是来自管理方面。如何为历史对象提供公共视图?我试图通过Django-REST-Framework提供历史记录访​​问。

1 个答案:

答案 0 :(得分:4)

Tastypie方法

  • 使用resource_name为Version (from reversion.models import Version)
  • 'versions'创建资源
  • 将以下网址格式添加到prepend_urls到已启用恢复的资源:

    url(r'^(?P<resource_name>{})/(?P<pk>\d+)/history{1}$'.format(self._meta.resource_name, trailing_slash()), self.wrap_view('dispatch_history'), name='history')
    
  • 将以下代码粘贴到资源中:

    def dispatch_history(self, request, **kwargs):
        try:
            bundle = self.build_bundle(data={
                'pk': kwargs['pk']
            }, request=request)
            obj = self.cached_obj_get(bundle=bundle, **self.remove_api_resource_names(kwargs))
        except ObjectDoesNotExist:
            return HttpGone()
    
        _versions = reversion.get_for_object(obj)
        versions = []
        for version in _versions:
            _resource = api.canonical_resource_for('versions')
            _bundle = _resource.build_bundle(version)
            _bundle = _resource.full_dehydrate(_bundle)
            versions.append(_bundle)
        return self.create_response(request, versions)
    

免责声明:此代码尚未经过测试,如果一次性使用,则称赞主。

PS:我很快就会与DRF实施类似的事情。完成后会更新答案。

Django Rest Framework

class VersionableModelViewSetMixin(viewsets.ModelViewSet):
    @detail_route()
    def history(self, request, pk=None):
        _object = self.get_object()
        _versions = reversion.get_for_object(_object)

        _context = {
            'request': request
        }

        _version_serializer = VersionSerializer(_versions, many=True, context=_context)
        # TODO
        # check pagination
        return Response(_version_serializer.data)

在包含已使用django-reversion注册的模型的所有视图中包含此Mixin。

希望这有点帮助。

最佳!!