[英]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 ,有兩種方法可以從請求中訪問參數。
如果您使用 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)
如果您使用諸如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']
使用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.