web-dev-qa-db-ja.com

ビューセット、Django-rest-frameworkのメソッドを無効にします

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)
94
db0

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):
    ...

このアプローチでは、ルーターは含まれるメソッドのルートのみを生成する必要があります。

参照

ModelViewSet

201
SunnySydeUp

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/ を気に入っていただけることでしょう。

98
Akshar Raaj

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スキーマのドキュメントが正しくなります。

4
storn

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

1
pymen