django-ビューセットViewSet
10557 ワード
ビューセットビューセット
ビューセットViewSetを使用すると、一連の論理関連アクションをクラスに配置できます. list()は、データのセット を提供する. retrieve()は、単一のデータ を提供する. create()データ作成 update()保存データ destory()削除データ ViewSetビューセットクラスはget()やpost()などのメソッドを実装するのではなく,list()やcreate()などのアクションアクションアクションを実装する.
ビューセットはas_のみを使用しますview()メソッドの場合,action動作は具体的な要求方式に対応する.次のようになります.
ルーティングを設定すると、次のように操作できます.
アクション属性
ビューセットでは、actionオブジェクトプロパティを使用して、現在ビューセットを要求したときのactionアクションがどれであるかを取得できます.
例:
共通ビューセットの親
1) ViewSet
ViewSetでは,アクションアクションメソッドは一切提供されておらず,我々自身がアクションメソッドを実現する必要がある.
2)GenericViewSet
3)ModelViewSet
4)ReadOnlyModelViewSet
ビューセット定義追加actionアクション
ビューセットでは、上記のデフォルトのメソッドアクションに加えて、カスタムアクションを追加することもできます.
カスタムアクションを追加するには、
Action装飾器で装飾する方法名はaction動作名としてリスト,retrieveと同等である.
Action装飾器は2つのパラメータを受信できます. methods:このactionがサポートするリクエスト方式、リスト伝達 detail:actionで処理するオブジェクトがビューリソースのオブジェクトかどうかを示す(urlパスでプライマリ・キーを取得するかどうか) Trueは、URLで取得するプライマリ・キーに対応するデータ・オブジェクト を表す. Falseは、URLを使用するプライマリ・キー を取得しないことを示す.
例:
urlの定義
ビューセットの継承関係
ルートRouters
ビューセットViewSetでは、要求方式とアクションアクションアクションとの対応関係を手動で指定できるほか、Routersを使用してルーティング情報を迅速に実現できます.
REST frameworkは2つのrouterを提供しています SimpleRouter DefaultRouter
1.使用方法
1)routerオブジェクトを作成し、ビューセットを登録します.たとえば、
register(prefix, viewset, base_name) prefixこのビューセットのルーティングプレフィックス viewsetビューセット base_nameルーティング名の接頭辞 上記のコードによって形成されるルーティングは以下の通りである.
2)ルーティングデータの追加
次の2つの方法があります.
または
2.ビューセットに追加アクションを含む
このビュー・セットのルート:
3.ルーティングrouterがURLを形成する方式
1) SimpleRouter
2)DefaultRouter
DefaultRouterとSimpleRouterの違いは、DefaultRouterにはデフォルトのAPIルートビューが追加され、すべてのリストビューを含むハイパーリンク応答データが返されることです.
ビューセットViewSetを使用すると、一連の論理関連アクションをクラスに配置できます.
ビューセットは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つのパラメータを受信できます.
例:
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を提供しています
1.使用方法
1)routerオブジェクトを作成し、ビューセットを登録します.たとえば、
from rest_framework import routers
router = routers.SimpleRouter()
router.register(r'books', BookInfoViewSet, base_name='book')
register(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ルートビューが追加され、すべてのリストビューを含むハイパーリンク応答データが返されることです.