2017-06-29 155 views
2

我對Django和REST來說很新,我希望能夠指定一個值並讓REST api只返回符合該值的行。有點像在sql select * from exampleTBL where id = 1中,然後返回第一行。但是,如果通過URL來完成:www.website/api/tmpHost/?id=1和T母雞第一行是通過REST API將過濾器添加到Django REST API

我的觀點看起來像返回:

class tmp_HostList(APIView): 
    def get (self, request, format=None): 
     tmp_hosts = tmp_Host.objects.all() 
     serializer = tmp_HostSerializer(tmp_hosts, many=True, context={'request': request}) 
     return Response(serializer.data) 

    def post(self, request, format=None): 
     serializer = tmp_HostSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     else: 
      return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

我的網址是這樣的:

url(r'^api/tmpHost/$', views.tmp_HostList.as_view()), 

我的串行的樣子:

class tmp_HostSerializer(DynamicFieldsMixin, serializers.ModelSerializer): 
    class Meta: 
     model = tmp_Host 
     fields = '__all__' 

我怎麼會去這樣做呢?我在這裏看到了解決方案,但它們似乎不適合我。在那裏,我使用API​​View和我的串行線路的區別是:serializer = tmp_HostSerializer(tmp_hosts, many=True, context={'request': request})而他們的將是簡單的像:serializer = tmp_HostSerializer

回答

0

只是檢查GET參數和參數返回一個過濾對象的最簡單方法:

from django.shortcuts import get_object_or_404 

class tmp_HostList(APIView): 

    def get (self, request, format=None): 
     param = request.GET.get('id') 
     if param: 
      tmp_host = get_object_or_404(Host, id=param) 
      serializer = tmp_HostSerializer(tmp_host) 
     else: 
      tmp_hosts = tmp_Host.objects.all() 
      serializer = tmp_HostSerializer(tmp_hosts, many=True) 
     return Response(serializer.data) 

另外也內置濾波通用視圖和viewsets doc link
但最好的選擇是創建一個詳細頁面單獨查看或使用視圖集中/通用視圖。
因此,您的視圖保持不變,併爲細節頁面添加一個新視圖。
網址:
url(r'^api/tmpHost/(?P<id>\d+)$', views.tmp_HostList.as_view())
觀點:

class tmp_HostDetail(APIView): 

    def get (self, request, id=None, format=None): 
     tmp_host = get_object_or_404(Host, id=id) 
     serializer = tmp_HostSerializer(tmp_host) 
     return Response(serializer.data) 
+0

你從哪裏得到的變量「Q」或者是應該由一個過濾器更換? –

+0

@JustinBraham應該是'param'。我犯了一個錯誤 –