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):
...
使用这种方法,路由器应该只为所包含的方法生成路由。
参考:
@SunnySydeUp现在尝试一下,看来路由器确实为列表视图生成了路由,但是它却是404s,因为ViewSet不知道如何处理请求。这是您所期望的吗?
通过仅使用所需的mixin,可以禁用GET,POST,PUT,DELETE方法,但是如果使用路由器,我无法找出如何禁用PATCH方法的方法。
@MuneebAhmad从中启用了PATCH方法
UpdateModelMixin
。如果您要使用更新而不是补丁,那么我目前可以想到两种方法。您可以覆盖视图中允许的方法并删除“补丁”,也可以覆盖partial_update
方法并调用http_method_not_allowed(request, *args, **kwargs)
。我还没有测试过,所以不确定它是否有效@JulioMarins我添加了参考。我不确定这是否是您想要的。
如果有人想将其设为只读视图集,则可以使用
class SampleViewSet(viewsets.ReadOnlyModelViewSet)
。