加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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获取这样的值:
/ users / show?user_id = 1或/ users / show?username = mike.

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())
]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读