【发布时间】:2017-09-17 16:18:58
【问题描述】:
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 的 ViewSet。这是最好的方法吗?有没有更优选的方式?
编辑:查看@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() 等)以使其正常工作吗?
【问题讨论】:
标签: django-rest-framework django-rest-viewsets