PUT
和PATCH
都是同一个mixin的一部分(即UpdateModelMixin)。
所以,如果我像这样扩展它:
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
我希望给予所有允许使用 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()
等)才能使它正常工作吗?
http_method_names = ["patch"]
这个可行,谢谢! - PolarBear10