簡體   English   中英

我在哪里可以訪問 Django Rest Framework 中的請求參數?

[英]Where can I access request parameters in Django Rest Framework?

我正在使用 Django Rest Framework 和 python-requests,並通過 URL 傳遞幾個變量,如下所示。

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

所以我傳遞了變量make、model 和plastic。 訪問這些參數的推薦方法如下所示。

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

但是,我不知道在哪里放置該行代碼。 我已經完成了 Django Rest Framework 的教程,並將我的視圖設置為與教程大致匹配。

視圖.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?")
    '''

我應該在哪里放置一行代碼來訪問這些請求參數?

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查詢BoxViewSet屬性並返回它。 否則返回排除任何未驗證對象的默認查詢集。

基於 Django Rest Framework's Filtering Documentation ,有兩種方法可以從請求中訪問參數。

1. 網址參數

如果您使用 URL 參數(例如mywebapp.com/api/<user_slug>/resource/ ),您可以訪問這樣的參數: self.kwargs['param_name']其中param_name是您使用的參數的名稱試圖獲得價值。 所以對於上面的例子,你有user_slug = self.kwargs['user_slug']

文檔中的示例

如果您的 URL 結構如下所示:

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查詢參數,您可以像在普通的 Django REST 方法中一樣使用self.request來訪問request 這使您可以訪問諸如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

在他們已經貢獻的基礎上再加一點,對於request.data['myvariable']發送對象時的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']

姜戈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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM