python – Django Rest在URL中需要参数
发布时间:2020-12-20 13:12:23 所属栏目:Python 来源:网络整理
导读:我正在使用 django rest框架. 这是我的代码: urls.py: urlpatterns = [ url(r'^users/show',UserShow.as_view()),] view.py: class UserShow(ListAPIView): queryset = User.objects.all() serializer_class = UserSerializer def get_queryset(self): qu
我正在使用
django rest框架.
这是我的代码: urls.py: urlpatterns = [ url(r'^users/show',UserShow.as_view()),] view.py: class UserShow(ListAPIView): queryset = User.objects.all() serializer_class = UserSerializer def get_queryset(self): queryset = User.objects.all() username = self.request.query_params.get('username',None) user_id = self.request.query_params.get('user_id',None) if username is not None: queryset = queryset.filter(username=username) if user_id is not None: queryset = queryset.filter(pk=user_id) return queryset 我想从url获取这样的值: user_id或username必须是必需参数.如何在基于类的视图中控制它? 使用我的代码如果我发送的请求有错误的参数名称/ users / show?user111name = mike或simple / users / show view当然用queryset = User.objects.all()回复我并列出所有用户.我不需要那个.如果需要的参数是404的无响应,我需要. 我可以通过基于函数的视图得到所需的结果: @api_view(['GET']) def users(request): if request.method == 'GET': queryset = User.objects.all() username = request.GET.get('username',None) user_id = request.GET.get('user_id',None) if username is not None: queryset = queryset.filter(username=username) elif user_id is not None: queryset = queryset.filter(pk=user_id) else: return Response({"status": "required field not found."},status=status.HTTP_404_NOT_FOUND) if not queryset.exists(): return Response({"status": "not found."},status=status.HTTP_404_NOT_FOUND) serializer = UserSerializer(queryset,many=True) return Response(serializer.data) 但是如何使用基于通用类的视图呢? 解决方法class UserIdRetrieve(RetrieveAPIView): queryset = User.objects.all() serializer_class = UserSerializer class UserUsernameRetrieve(UserIdRetrieve): lookup_field = 'username' 并在网址中: urlpatterns = [ url(r'^users/(?P<pk>d+)/',UserIdRetrieve.as_view()),url(r'^users/by-username/(?P<username>w+)/',UserUsernameRetrieve.as_view()) ] 如果您的网址结构是必须的,小改动到上面: class UserIdRetrieve(RetrieveAPIView): queryset = User.objects.all() serializer_class = UserSerializer def get_object(self): queryset = self.filter_queryset(self.get_queryset()) if 'username' in self.request.query_params: filter_kwargs = {'username': self.request.query_params['username']} elif 'user_id' in self.request.query_params: filter_kwargs = {'id': self.request.query_params['user_id']} else: raise Http404('Missing required parameters') obj = get_object_or_404(queryset,**filter_kwargs) # May raise a permission denied self.check_object_permissions(self.request,obj) return obj 并在网址中: urlpatterns = [ url(r'^users/show',UserRetrieve.as_view()) ] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |