ViewSets
には、リスト、取得、作成、更新、削除などの自動メソッドがあります...
それらのいくつかを無効にしたいと思います。OPTIONS
はまだ許可されていると述べているので、私が思いついた解決策はおそらく良いものではありません。
これを正しい方法で行う方法についてのアイデアはありますか?
class SampleViewSet(viewsets.ModelViewSet):
queryset = api_models.Sample.objects.all()
serializer_class = api_serializers.SampleSerializer
def list(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
def create(self, request):
return Response(status=status.HTTP_405_METHOD_NOT_ALLOWED)
ModelViewSet
の定義は次のとおりです。
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet)
ModelViewSet
を拡張するのではなく、必要なものだけを使用しないのはなぜですか。たとえば、次のとおりです。
from rest_framework import viewsets, mixins
class SampleViewSet(mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet):
...
このアプローチでは、ルーターは含まれるメソッドのルートのみを生成する必要があります。
参照:
viewsets.ModelViewSet
を使用し続け、ViewSetでhttp_method_names
を定義できます。
例
class SampleViewSet(viewsets.ModelViewSet):
queryset = api_models.Sample.objects.all()
serializer_class = api_serializers.SampleSerializer
http_method_names = ['get', 'post', 'head']
http_method_names
を追加すると、put
およびpatch
を実行できなくなります。
put
は必要だがpatch
は必要ない場合は、http_method_names = ['get', 'post', 'head', 'put']
を保持できます
内部的には、DRFビューはDjango= CBVから拡張されています。Django= CBVにはhttp_method_namesという属性があります。DRFビューでもhttp_method_namesを使用できます。
[Shameless Plug]:この回答が役に立った場合、DRFでの私の一連の投稿 https://www.agiliq.com/blog/2019/04/drf-polls/ を気に入っていただけることでしょう。
DRFビューセットからPUTメソッドを無効にしようとしている場合、カスタムルーターを作成できます。
from rest_framework.routers import DefaultRouter
class NoPutRouter(DefaultRouter):
"""
Router class that disables the PUT method.
"""
def get_method_map(self, viewset, method_map):
bound_methods = super().get_method_map(viewset, method_map)
if 'put' in bound_methods.keys():
del bound_methods['put']
return bound_methods
ルーターでメソッドを無効にすることにより、APIスキーマのドキュメントが正しくなります。
DRFでViewSetの「DELETE」メソッドを無効にする方法
class YourViewSet(viewsets.ModelViewSet):
http_method_names = [m for m in super().http_method_names if m != 'delete']
PSこれは、必要なすべてのメソッドを明示的に指定するよりも信頼性が高いため、重要なメソッドOPTIONS、HEADなどの一部を忘れる可能性が低くなります
P.P.S。デフォルトでは、DRFにはhttp_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']