PUT
和PATCH
都是同一个mixin的一部分(UpdateModelMixin)。如何不允许PUT方法,但允许在DRF ViewSet中使用PATCH?
所以,如果我延长它像这样:
class UserViewSet(mixins.UpdateModelMixin, GenericViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
两个PUT
和PATCH
是允许的。我不想为我的应用程序允许PUT
(因为PATCH
已经完成了这项工作,并且我想仅使用POST
限制对象创建)。一种方法是创建权限:
class NoPut(permissions.BasePermission):
"""
PUT not allowed.
"""
message = 'You do not have permission to complete the action you are trying to perform.'
def has_object_permission(self, request, view, obj):
if view.action == "update":
return False
return True
而且给这个权限我所有的ViewSets允许PATCH
。这是做这件事的最好方法吗?有更好的方法吗?
编辑:查看由@wim提供的答案后,将本是一个精解(保留一切除了put
映射相同移除):
from rest_framework.routers import SimpleRouter
class NoPutRouter(SimpleRouter):
routes = [
# List route.
Route(
url=r'^{prefix}{trailing_slash}$',
mapping={
'get': 'list',
'post': 'create'
},
name='{basename}-list',
initkwargs={'suffix': 'List'}
),
# Dynamically generated list routes.
# Generated using @list_route decorator
# on methods of the viewset.
DynamicListRoute(
url=r'^{prefix}/{methodname}{trailing_slash}$',
name='{basename}-{methodnamehyphen}',
initkwargs={}
),
# Detail route.
Route(
url=r'^{prefix}/{lookup}{trailing_slash}$',
mapping={
'get': 'retrieve',
# put removed
'patch': 'partial_update',
'delete': 'destroy'
},
name='{basename}-detail',
initkwargs={'suffix': 'Instance'}
),
# Dynamically generated detail routes.
# Generated using @detail_route decorator on methods of the viewset.
DynamicDetailRoute(
url=r'^{prefix}/{lookup}/{methodname}{trailing_slash}$',
name='{basename}-{methodnamehyphen}',
initkwargs={}
),
]
或我需要重新定义其他方法在SimpleRoute
(例如__init()__
,get_routes()
,_get_dynamic_routes()
,get_method_map()
等)为了使它正常工作?
感谢。好吧,我编辑了我的答案,包括新的自定义路由器。你可以验证它是一个好的自定义路由器,还是我需要重新定义'SimpleRouter'中的其他方法才能正常工作? – user2719875