如何将django reversion添加到使用django和django-rest框架开发的应用程序中



我有一个使用Django和Django Rest框架开发的应用程序。我想在我的应用程序中添加django恢复功能。

我已经试过了http://django-reversion.readthedocs.org/en/latest/api.html#low-level api,但我未能对我的应用程序进行特定的更改。

下面是应用程序的模块,我想在其中包括Django反转,以在对象被删除时恢复它们。如何设置以下模块的django反转配置

admin.py:-

from django.contrib import admin
from.models import Category
admin.site.register(Category)

型号.py:-

  from django.db import models
  class Category(models.Model):
     name = models.CharField(max_length=64, unique=True)
     def __unicode__(self):
         return self.name

序列化程序.py:-

        from rest_framework import serializers
        from .models import Category
        class CategorySerializer(serializers.ModelSerializer):
              courses = serializers.HyperlinkedRelatedField(
                  many=True
                  read_only=True
                  view_name='course-detail'
               )
               class Meta:
                     model = Category
                     fields = ('pk', 'name', 'courses',)

urls.py:-

            from django.conf.urls import patterns, url
            from rest_framework.urlpatterns import format_suffix_patterns
            from .import views
            from django.conf.urls import include
            category_list = views.CategoryViewSet.as_view({
                'get': 'list',
                'post': 'create'
            })
            category_detail = views.CategoryViewSet.as_view({
                'get': 'retrieve',
                'put': 'update',
                'patch': 'partial_update',
                'delete': 'destroy',
           })
           urlpatterns = format_suffix_patterns([
                url(r'^categories/$',
                    category_list,
                    name='category-list'),
                url(r'^categories/(?P<pk>[0-9]+)/$',
                    category_detail,
                    name='category-detail'),
           ])
           urlpatterns += [
               url(r'^api-auth/', include('rest_framework.urls',
                                          namespace='rest_framework')),
           ]

views.py:-

from rest_framework import permissions
from rest_framework import viewsets
from .models import Category
from .serializers import CategorySerializer
class CategoryViewSet(viewsets.ModelViewSet):
 queryset = Category.objects.all()
 serializer_class = CategorySerializer
 permission_classes = (permissions.IsAuthenticatedorReadOnly,)

创建修订的最简单方法是使用reversion.middleware.RevisionMiddleware。这将自动将每个请求包装在修订中,确保对模型的所有更改都将添加到其版本历史记录中。

要启用修订中间件,只需将其添加到MIDDLEWARE_CLASSES设置中,如下所示:

MIDDLEWARE_CLASSES = (
    'reversion.middleware.RevisionMiddleware',
    # Other middleware goes here...
)

任何更复杂的事情都需要通过代码添加API调用,该调用以决定的方式封装特定的save调用。

admin.py

from django.contrib import admin
from.models import Category
import reversion
class BaseReversionAdmin(reversion.VersionAdmin):
 pass
admin.site.register(Category, BaseReversionAdmin)

还添加了对installed_apps和中间件类的还原。

最后,我可以看到"恢复删除的对象按钮"。

我发现,由于rest_framework.viewsets.ModelViewSet继承自django.views.generic.View,因此如果需要,您也可以使用reversion.views.RevisionMixin来创建修订,而不必使用中间件。

从上面的问题来看,这看起来如下:

from rest_framework import permissions
from rest_framework import viewsets
from .models import Category
from .serializers import CategorySerializer
from reversion.views import RevisionMixin
class CategoryViewSet(RevisionMixin, viewsets.ModelViewSet):
    queryset = Category.objects.all()
    serializer_class = CategorySerializer
    permission_classes = (permissions.IsAuthenticatedorReadOnly,)

您可以在此处阅读有关如何使用RevisionMixin的详细信息:https://django-reversion.readthedocs.io/en/stable/views.html#reversion-查看中的修订混合

最新更新