【问题标题】:Where can I access request parameters in Django Rest Framework?我在哪里可以访问 Django Rest Framework 中的请求参数?
【发布时间】:2016-10-29 23:42:37
【问题描述】:

我正在使用 Django Rest Framework 和 python-requests 并通过 URL 传递几个变量,如下所示。

GET /api/boxobjects/?format=json&make=Prusa&model=i3&plastic=PLA HTTP/1.1

我正在传递变量品牌、型号和塑料。访问这些参数的推荐方法如下所示。

makedata = request.GET.get('make', '')

但是,我不知道将那行代码放在哪里。我已经完成了 Django Rest Framework 的教程,并将我的视图设置为与教程大致匹配。

views.py:

@api_view(['GET'])
@login_required
def api_root(request, format=None):
    return Response({
        'Users': reverse('api:user-list', request=request, format=format),
        'Objects': reverse('api:object-list', request=request, format=format),
        'Files': reverse('api:file-list', request=request, format=format),
        'Config Files': reverse('api:config-list', request=request, format=format),
        'Box-objects': reverse('api:box-object-list', request=request, format=format),
    })

class BoxViewSet(viewsets.ModelViewSet):
    queryset = Uploadobject.objects.all().exclude(verified=False)
    serializer_class = BoxSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                            IsBox)

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

    #Maybe get function here? Not displaying
    '''
    def get(self, request):
        print ("request set here?")
    '''

我应该在哪里放置一行代码来访问这些请求参数?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:
    class BoxViewSet(viewsets.ModelViewSet):
        queryset = Uploadobject.objects.all().exclude(verified=False)
        serializer_class = BoxSerializer
        permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                                IsBox)
    
        def perform_create(self, serializer):
            serializer.save(owner=self.request.user)
    
    
        def get_queryset(self):
            req = self.request
            print(req)
            make = req.query_params.get('make')
            if make:
                self.queryset = uploadobject.objects.filter(make=make)
                return self.queryset
            else:
                return self.queryset
    

    语句在做什么?

    如果'make' 在请求的查询参数中,则使用基于'make' 的新查询集覆盖BoxViewSet 查询集属性并返回它。否则返回排除任何未验证对象的默认查询集。

    【讨论】:

    • 这很完美!事实上很好,它可以在没有 if/else 语句的情况下工作。对于奖励积分,该声明有什么作用?
    【解决方案2】:

    基于 Django Rest Framework 的Filtering Documentation,有两种方法可以从请求中访问参数。

    1。网址参数

    如果您使用 URL 参数(例如 mywebapp.com/api/<user_slug>/resource/),您可以像这样访问参数:self.kwargs['param_name'] 其中param_name 是您尝试获取其值的参数的名称。所以对于上面的例子,你会有user_slug = self.kwargs['user_slug']

    文档中的示例

    如果您的网址结构如下所示:

    url('^purchases/(?P<username>.+)/$', PurchaseList.as_view()),
    

    ...并希望过滤该用户名。您可以覆盖 get_queryset(),您的视图将如下所示:

    class PurchaseList(generics.ListAPIView):
        serializer_class = PurchaseSerializer
    
        def get_queryset(self):
            """
            This view should return a list of all the purchases for
            the user as determined by the username portion of the URL.
            """
            username = self.kwargs['username']
            return Purchase.objects.filter(purchaser__username=username)
    

    2。查询参数

    如果您使用mywebapp.com/api/resource?user_slug=plain-jane 等查询参数,则可以使用self.request 访问request,就像在普通的Django REST 方法中一样。这使您可以访问诸如self.request.query_params 之类的内容。对于上面的例子,你会说user_slug = self.request.query_params['user_slug']。你也可以像user = self.request.user一样访问当前用户。

    文档中的示例

    假设您要支持这样的请求结构:

    http://example.com/api/purchases?username=denvercoder9
    

    ...并希望过滤该用户名。这样做覆盖查询集:

    class PurchaseList(generics.ListAPIView):
        serializer_class = PurchaseSerializer
    
        def get_queryset(self):
            """
            Optionally restricts the returned purchases to a given user,
            by filtering against a `username` query parameter in the URL.
            """
            queryset = Purchase.objects.all()
            username = self.request.query_params.get('username', None)
            if username is not None:
                queryset = queryset.filter(purchaser__username=username)
            return queryset
    

    【讨论】:

      【解决方案3】:

      Django 2

      使用 request.parser_context

       def perform_create(self, serializer):
              post_id = self.request.parser_context['kwargs'].get('post_id')
              post = Post.objects.get(id=post_id)
              serializer.save(post=post)
      

      【讨论】:

        【解决方案4】:

        在已经贡献的基础上再补充一点,modelviewset中的POST方法在发送对象时,需要使用request.data['myvariable']

        示例:

        class BoxViewSet(viewsets.ModelViewSet):
        
            queryset = Uploadobject.objects.all().exclude(verified=False)
            serializer_class = BoxSerializer
            permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                                IsBox)
        
            def create(self, request):
               ...
               make = request.data['make']
        

        【讨论】:

          猜你喜欢
          • 2018-05-30
          • 1970-01-01
          • 1970-01-01
          • 2012-03-12
          • 1970-01-01
          • 2011-06-27
          • 2010-12-23
          • 2019-11-22
          • 2010-11-15
          相关资源
          最近更新 更多