django-ビューセットViewSet

10557 ワード

ビューセットビューセット
ビューセットViewSetを使用すると、一連の論理関連アクションをクラスに配置できます.
  • list()は、データのセット
  • を提供する.
  • retrieve()は、単一のデータ
  • を提供する.
  • create()データ作成
  • update()保存データ
  • destory()削除データ
  • ViewSetビューセットクラスはget()やpost()などのメソッドを実装するのではなく,list()やcreate()などのアクションアクションアクションを実装する.
    ビューセットはas_のみを使用しますview()メソッドの場合,action動作は具体的な要求方式に対応する.次のようになります.
    class BookInfoViewSet(viewsets.ViewSet):
    
        def list(self, request):
            ...
    
        def retrieve(self, request, pk=None):
            ...
    

    ルーティングを設定すると、次のように操作できます.
    urlpatterns = [
        url(r'^books/$', BookInfoViewSet.as_view({'get':'list'}),
        url(r'^books/(?P\d+)/$', BookInfoViewSet.as_view({'get': 'retrieve'})
    ]
    

    アクション属性
    ビューセットでは、actionオブジェクトプロパティを使用して、現在ビューセットを要求したときのactionアクションがどれであるかを取得できます.
    例:
    def get_serializer_class(self):
        if self.action == 'create':
            return OrderCommitSerializer
        else:
            return OrderDataSerializer
    

    共通ビューセットの親
    1) ViewSet APIViewから継承され、APIViewとほぼ同様の役割を果たし、アイデンティティ認証、権限検証、トラフィック管理などを提供しています.
    ViewSetでは,アクションアクションメソッドは一切提供されておらず,我々自身がアクションメソッドを実現する必要がある.
    2)GenericViewSet GenericAPIViewから継承され、役割もGenericAPIVIewと同様にget_が提供されています.object、get_querysetなどの方法はリストビューと詳細情報ビューの開発に便利である.
    3)ModelViewSet GenericAPIVIewから継承され、ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixinが含まれます.
    4)ReadOnlyModelViewSet GenericAPIVIewから継承され、ListModelMixin、RetrieveModelMixinも含まれています.
    ビューセット定義追加actionアクション
    ビューセットでは、上記のデフォルトのメソッドアクションに加えて、カスタムアクションを追加することもできます.
    カスタムアクションを追加するには、rest_framework.decorators.actionデコレーションを使用する必要があります.
    Action装飾器で装飾する方法名はaction動作名としてリスト,retrieveと同等である.
    Action装飾器は2つのパラメータを受信できます.
  • methods:このactionがサポートするリクエスト方式、リスト伝達
  • detail:actionで処理するオブジェクトがビューリソースのオブジェクトかどうかを示す(urlパスでプライマリ・キーを取得するかどうか)
  • Trueは、URLで取得するプライマリ・キーに対応するデータ・オブジェクト
  • を表す.
  • Falseは、URLを使用するプライマリ・キー
  • を取得しないことを示す.

    例:
    from rest_framework import mixins
    from rest_framework.viewsets import GenericViewSet
    from rest_framework.decorators import action
    
    class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
    
        # detail False           BookInfo  
        @action(methods=['get'], detail=False)
        def latest(self, request):
            """
                     
            """
            book = BookInfo.objects.latest('id')
            serializer = self.get_serializer(book)
            return Response(serializer.data)
    
        # detail True,        pk     BookInfo  
        @action(methods=['put'], detail=True)
        def read(self, request, pk):
            """
                      
            """
            book = self.get_object()
            book.bread = request.data.get('read')
            book.save()
            serializer = self.get_serializer(book)
            return Response(serializer.data)
    

    urlの定義
    urlpatterns = [
        url(r'^books/$', views.BookInfoViewSet.as_view({'get': 'list'})),
        url(r'^books/latest/$', views.BookInfoViewSet.as_view({'get': 'latest'})),
        url(r'^books/(?P\d+)/$', views.BookInfoViewSet.as_view({'get': 'retrieve'})),
        url(r'^books/(?P\d+)/read/$', views.BookInfoViewSet.as_view({'put': 'read'})),
    ]
    

    ビューセットの継承関係
    ルートRouters
    ビューセットViewSetでは、要求方式とアクションアクションアクションとの対応関係を手動で指定できるほか、Routersを使用してルーティング情報を迅速に実現できます.
    REST frameworkは2つのrouterを提供しています
  • SimpleRouter
  • DefaultRouter

  • 1.使用方法
    1)routerオブジェクトを作成し、ビューセットを登録します.たとえば、
    from rest_framework import routers
    
    router = routers.SimpleRouter()
    router.register(r'books', BookInfoViewSet, base_name='book')
    

    register(prefix, viewset, base_name)
  • prefixこのビューセットのルーティングプレフィックス
  • viewsetビューセット
  • base_nameルーティング名の接頭辞
  • 上記のコードによって形成されるルーティングは以下の通りである.
    ^books/$    name: book-list
    ^books/{pk}/$   name: book-detail
    

    2)ルーティングデータの追加
    次の2つの方法があります.
    urlpatterns = [
        ...
    ]
    urlpatterns += router.urls
    

    または
    urlpatterns = [
        ...
        url(r'^', include(router.urls))
    ]
    

    2.ビューセットに追加アクションを含む
    class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoSerializer
    
        @action(methods=['get'], detail=False)
        def latest(self, request):
            ...
    
        @action(methods=['put'], detail=True)
        def read(self, request, pk):
            ...
    

    このビュー・セットのルート:
    ^books/latest/$    name: book-latest
    ^books/{pk}/read/$  name: book-read
    

    3.ルーティングrouterがURLを形成する方式
    1) SimpleRouter
    2)DefaultRouter
    DefaultRouterとSimpleRouterの違いは、DefaultRouterにはデフォルトのAPIルートビューが追加され、すべてのリストビューを含むハイパーリンク応答データが返されることです.