在我的代码中,我为用户提供了一个视图集。 我希望只允许ReadOnlyModelViewSet可以执行的读取操作(/users/42和/users/)。
此外,我希望有一个/users/registerURL,以便注册新用户。
class UserViewSet(viewsets.ReadOnlyModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
@list_route(methods=['post'])
def register(request):
serializer = UserSerializer(data=request.DATA)
if serializer.is_valid():
user = User.objects.create_user(
username = serializer.init_data['username'],
password = serializer.init_data['password'],
)
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
几个问题:
这样做对吗?
如果我将一个方法放入列表路径或详细路径装饰器中,它是否有特定的签名?因为在详细路由示例中,方法的签名始终相同:方法名(self,request,pk=None):
谢谢!
您的代码几乎是正确的,您只是在register方法上缺少正确的签名:
根据the documentation,这是正确的签名。另外the tests建议不可能传递用于路由的附加参数,并且将始终为
@detail_route
传递pk,因此您必须:详细路线和
对于列表路由。
不过,我建议您利用内置的ViewSetMixins as ModelViewSet does internally:
对于一般的用户注册,您还可以查看django-registration-restframework,我目前正在为我的项目工作。
就我个人而言,我依赖于我的项目中的ModelViewSet,并确保只有经过适当授权的用户才能执行某些操作。为此,您可以使用模型范围内的permissions或与django guardian对象特定权限结合使用。
尤其是使用REST API,您最终会发现您希望某些用户只对某些对象执行操作,而不必对每个请求进行微观管理。对象级权限在这里非常有用。
detail_route和detail_list将在DRF 3.0上被弃用,而使用@action:
当此方法将解释由该端点表示的模型的单个实例时,使用detail=True;当它需要表示该模型的Queryset时,使用False
相关问题 更多 >
编程相关推荐