在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
,您将无法再进行put
和patch
。
如果你想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架构文档将是正确的。