Django rest框架-使用detail_route和detail_lis

2024-05-19 16:24:43 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的代码中,我为用户提供了一个视图集。 我希望只允许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):

谢谢!


Tags: 方法用户dataobjectsinitrequeststatususername
2条回答

您的代码几乎是正确的,您只是在register方法上缺少正确的签名:

def register(self, request):

根据the documentation,这是正确的签名。另外the tests建议不可能传递用于路由的附加参数,并且将始终为@detail_route传递pk,因此您必须:

@detail_route
def register(self, request, pk=None):

详细路线和

@list_route
def register(self, request):

对于列表路由。

不过,我建议您利用内置的ViewSetMixins as ModelViewSet does internally

from rest_framework import exceptions, mixins
class UserViewSet(mixins.CreateModelMixin,
               mixins.RetrieveModelMixin,
               mixins.ListModelMixin,
               GenericViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    def create(self, 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)

对于一般的用户注册,您还可以查看django-registration-restframework,我目前正在为我的项目工作。

就我个人而言,我依赖于我的项目中的ModelViewSet,并确保只有经过适当授权的用户才能执行某些操作。为此,您可以使用模型范围内的permissions或与django guardian对象特定权限结合使用。

尤其是使用REST API,您最终会发现您希望某些用户只对某些对象执行操作,而不必对每个请求进行微观管理。对象级权限在这里非常有用。

detail_route和detail_list将在DRF 3.0上被弃用,而使用@action:

from rest_framework.decorators import action
    @action(methods=['POST'], detail=True)
    def sale(self):
       ...

当此方法将解释由该端点表示的模型的单个实例时,使用detail=True;当它需要表示该模型的Queryset时,使用False

相关问题 更多 >