2017-05-11 2 views
0

Ich habe eine APIView-Klasse zum Anzeigen aller Mieten und Buchung und Löschen usw. Jetzt möchte ich Suchfunktion, also habe ich versucht, DjangoFilterBackend zu verwenden, aber es funktioniert nicht. Ich sehe in der Dokumentation, es wurde mit ListAPIView verwendet, aber wie kann ich es in APIView verwenden.django filter auf APIView

class Rent(APIView): 
    """ 
    List all the rents if token is not provided else a token specific rent 
    """ 
    serializer_class = RentSerializer 
    filter_backends = (DjangoFilterBackend,) 
    filter_fields = ('city', 'place', 'property_category',) 
    search_fields = ('=city', '=place') 
    def get(self, request, token=None, format=None): 
     reply={} 
     try: 
      rents = Rental.objects.all() 
      if token: 
       rent = Rental.objects.get(token=token) 
       reply['data'] = self.serializer_class(rent).data 
      else: 
       reply['data'] = self.serializer_class(rents, many=True).data 
     except Rental.DoesNotExist: 
      return error.RequestedResourceNotFound().as_response() 
     except: 
      return error.UnknownError().as_response() 
     else: 
      return Response(reply, status.HTTP_200_OK) 

, wenn ich die Miete mit den folgenden Parametern in der URL zu suchen, erhalte ich alle Mieten, stattdessen soll ich nur die Mieten erhalten, die in der Stadt Kathmandu und Ort koteshwor liegt

http://localhost:8000/api/v1/rents?city=Kathmandu&place=Koteshwor

+0

Da der Zweck dieser Ansicht scheint, eine Liste von Objekten zurückzugeben, warum nicht einfach verwenden eine 'ListAPIView'? – ChidG

+0

Ich habe einen Eintrag gemacht, aktualisiert, alles auf dieser Ansicht gelöscht und auch eine einzelne Miete oder die gesamte Miete wurde mit einer einzigen get-Funktion statt ListAPIView und RetrieveAPIView – Serenity

+0

getan, so dass Sie die Funktionalität eines DRF repliziert haben Ansichtssatz – ChidG

Antwort

1

Hier Wenn Sie APIView verwenden, gibt es nichts mit filters.So zu tun ist, Sie wie

get_data = request.query_params #or request.GET check both 

Dann

Rental.objects.filter(city=get_data['city'], place=get_data['place']) 
zu tun haben
+0

Ich könnte mit ListAPIView tun, aber diese ist auch gut. – Serenity

+0

Wenn Sie 'ListAPIView' verwenden, verwendet' drf' zum Filtern nur diesen django-ORM-Ansatz. – itzMEonTV

+0

Der Grund, warum ich APIView favorisiere, ist, dass wir alles manuell machen müssen. Dies wird mir helfen, das Konzept mehr und mehr zu lernen. Ich bin mit dem Weg gekommen, den du mir gezeigt hast. Danke für Ihre Hilfe. Noch eine Frage, weißt du über setup_eager_loading in rest_framework? – Serenity

3

Um die Funktionalität von DjangoFilterBackend zu verwenden, könnten Sie die filter_queryset-Methode von GenericViewSet einbinden, die die DRF-Klasse ist, die von APIView erbt und zu allen spezifischen 'generischen' Ansichtsklassen in DRF führt. Es sieht wie folgt aus:

def filter_queryset(self, queryset): 
    """ 
    Given a queryset, filter it with whichever filter backend is in use. 
    You are unlikely to want to override this method, although you may need 
    to call it either from a list view, or from a custom `get_object` 
    method if you want to apply the configured filtering backend to the 
    default queryset. 
    """ 
    for backend in list(self.filter_backends): 
     queryset = backend().filter_queryset(self.request, queryset, self) 
    return queryset 

https://github.com/encode/django-rest-framework/blob/master/rest_framework/generics.py

+0

Warum wird eine negative Stimme gegeben? – Serenity

+0

Ich frage mich das gleiche;) – ChidG

Verwandte Themen