8

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')),
           ]

ビュー.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,)
4

3 に答える 3

7

リビジョンを作成する最も簡単な方法は、 reversion.middleware.RevisionMiddleware を使用することです。これにより、すべてのリクエストがリビジョンに自動的にラップされ、モデルへのすべての変更がバージョン履歴に確実に追加されます。

MIDDLEWARE_CLASSESリビジョン ミドルウェアを有効にするには、次のように設定に追加するだけです。

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

これをより複雑にするには、特定のsave呼び出しを任意の方法でラップするコードを介して API 呼び出しを追加する必要があります

于 2015-02-18T22:22:11.227 に答える
1

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 と middlewareclasses への復帰も追加されました。

最後に、「削除されたオブジェクトの復元ボタン」が表示されました。

于 2015-02-19T17:43:11.933 に答える
0

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-views-revisionmixin

于 2022-01-07T15:06:37.993 に答える