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

如何将django-reversion添加到使用django和django-rest框架开发的应用程序中 (How to add django-reversion to an app developed using django and django-rest framework)

问题

我有一个使用Django和Django Rest框架开发的应用程序。我想将django-reversion功能添加到我的应用程序中。

我已经尝试过http://django-reversion.readthedocs.org/en/latest/api.html#low-level-api,但我没有对我的应用进行具体的更改。

下面是应用程序的模块,我想包括Django-reversion来恢复对象,如果它们被删除。如何为以下模块设置django-reversion配置

admin.py:-

from django.contrib import admin
from.models import Category

admin.site.register(Category)

models.py:-

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

     def __unicode__(self):
         return self.name

serializers.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,以决定的方式包装特定的调用。

问题

I have an app developed using Django and Django Rest framework. I would like to add the django-reversion feature to my app.

I have already tried http://django-reversion.readthedocs.org/en/latest/api.html#low-level-api but I have failed to make specific changes to my app.

Below are the modules of the app where I would like to include the Django-reversion to restore objects if they get deleted. How to set the django-reversion configuration for the below modules

admin.py:-

from django.contrib import admin
from.models import Category

admin.site.register(Category)

models.py:-

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

     def __unicode__(self):
         return self.name

serializers.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,)

解决方法

The simplest way to create revisions is to use reversion.middleware.RevisionMiddleware. This will automatically wrap every request in a revision, ensuring that all changes to your models will be added to their version history.

To enable the revision middleware, simply add it to your MIDDLEWARE_CLASSES setting as follows:

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

Any thing more complex with this will require adding API calls through your code in away that wraps specific save calls in ways that you decide.

相似信息