djangoのdrfのビューセットについて
7828 ワード
ビューセットビューセット
ビューセット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の定義
ビューセット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'})),
]