在ViewSet中禁用一个方法,django-rest-framework

ViewSets有自动方法列出,检索,创build,更新,删除,…

我想禁用其中一些,我提出的解决scheme可能不是一个好的,因为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): ... 

采用这种方法,路由器应该只为包含的方法生成路由。

参考

ModelViewSet

您可以继续使用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 ,您将无法再进行putpatch

如果你想put但不想patch ,你可以保持http_method_names = ['get', 'post', 'head', 'put']

在内部,DRF Views从Django CBV扩展而来。 Django CBV有一个名为http_method_names的属性。 所以你也可以使用http_method_names和DRF视图。

如果您尝试从DRF视图集禁用PUT方法,则可以创build自定义路由器:

 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架构文档将是正确的。