1

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

但这仅来自管理员方面。如何为历史对象提供公共视图?我正在尝试通过 Django-REST-Framework 提供历史访问。

4

1 回答 1

4

美味的方法

  • 使用 resource_name 创建一个资源Version (from reversion.models import Version)'versions'
  • 将以下 url 模式添加到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 休息框架

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)

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

希望这个对你有帮助。

最好的!!

于 2015-02-23T17:41:11.587 回答