2017-06-29 3 views
2

Ich bin ziemlich neu in Django und REST und ich möchte in der Lage sein, einen Wert anzugeben und die REST API geben nur eine Zeile zurück, wo dieser Wert erfüllt ist. Ein bisschen wie in Sql select * from exampleTBL where id = 1 und dann wird die erste Zeile zurückgegeben. Aber es würde durch die URL erfolgen: www.website/api/tmpHost/?id=1 und t Henne die erste Zeile durch das REST-API zurückgegeben wirdHinzufügen von Filtern zu Django REST API

Meine Ansicht wie folgt aussieht:

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) 

meine url wie folgt aussehen:

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

Mein Serializer sieht so aus:

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

Wie würde ich das machen? Ich habe hier Lösungen gesehen, aber sie scheinen nicht für mich zu funktionieren. Die Unterschiede in dem, dass ich APIView und meine Serializer Linie verwenden wäre: serializer = tmp_HostSerializer(tmp_hosts, many=True, context={'request': request}) während ihre wie einfach wäre: serializer = tmp_HostSerializer

Antwort

0

Der einfachste Weg ist, überprüfen nur für get Parameter und Rückgabe ein gefiltertes Objekt durch den Parameter:

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) 

Es gibt auch eingebaute Filter für generische Ansichten und Viewsets doc link
Aber die beste Wahl ist, erstellen Sie eine separate Ansicht für die Detailseite oder verwenden Sie Viewset/generische Ansichten.
So bleibt Ihre Ansicht gleich und Sie fügen eine neue Detailseite hinzu.
Urls:
url(r'^api/tmpHost/(?P<id>\d+)$', views.tmp_HostList.as_view())
Ansichten:

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

Wo haben Sie die Variable 'q' erhalten oder ist das durch einen Filter ersetzt werden soll? –

+0

@JustinBraham sollte es "param" sein. Ich habe einen Fehler gemacht –

Verwandte Themen