Ich verwende get_queryset mit Django-REST-Framework, um APIs für meine App zu erstellen.Verwendung von Django-Rest-Framework wie Abfrage für Listenfelder funktioniert?
Ich möchte wissen, ob es einen Weg gibt, diesen Filter zum Laufen zu bringen
http://api/data?district=Nasik,Pune
alle Daten mit Kreis „Pune“ zu bekommen oder Viertel „Nasik“. Ich habe versucht, mit
http://api/data?district=Nasik&district=Pune aber wie erwartet es tut ein UND zwischen den Filtern und nur die Pune Bezirk abrufen (ich nehme an, weil es das letzte Filter ist).
Hier ist mein Code:
from rest_framework_mongoengine.viewsets import ModelViewSet as MongoModelViewSet
from app.serializers import *
from mongoengine.queryset.visitor import Q
class ToolViewSet(MongoModelViewSet):
serializer_class = ToolSerializer
def get_queryset(self, *args, **kwargs):
queryset_list =Tool.objects.all()
fruit=self.request.query_params.get("fruit")
district=self.request.query_params.get("district")
taluka=self.request.query_params.get("taluka")
if fruit and district:
queryset_list = queryset_list.filter(
Q(fruit__icontains=fruit)
&Q(district__icontains=district)
)
return queryset_list
if fruit and taluka:
queryset_list = queryset_list.filter(
Q(fruit__icontains=fruit)
&Q(taluka__icontains=taluka)
)
return queryset_list
if district and taluka:
queryset_list = queryset_list.filter(
Q(district__icontains=district)
&Q(taluka__icontains=taluka)
)
return queryset_list
elif fruit:
queryset_list = queryset_list.filter(
Q(fruit__icontains=fruit)
)
return queryset_list
elif district:
queryset_list = queryset_list.filter(
Q(district__icontains=district)
)
return queryset_list
elif taluka:
queryset_list = queryset_list.filter(
Q(taluka__icontains=taluka)
)
return queryset_list
sodass dieser Code für zwei verschiedene Arbeitsfelder,
zum Beispiel:
http://api/?data?fruit=Banana&district=Pune
http://api/?data?fruit=Banana&taluka=Haveli
http://api/?data?taluka=Haveli&district=Pune
alle arbeiten, aber
http://api/data?district=Nasik,Pune
dies nicht funktioniert, hier verwende ich diesen Code für "OR"
if district or district:
queryset_list = queryset_list.filter(
Q(district__icontains=fruit)
|Q(district__icontains=district)
)
return queryset_list
aber es funktioniert nicht, keine Ahnung, wie um das zu lösen?
antwortete ich eine weitere Frage auf, wie vor kurzem Liste von Parametern zu lösen, könnten Sie es mit der Lösung Ihrer Liste der Filter Worte nützlich finden: http://stackoverflow.com/a/41335388/7120972. Außerdem können Sie Ihre Liste der Querybuilder (Q-Objekte) einfacher auflösen: http://stackoverflow.com/a/26613698/7120972. –
Ich habe eine Django-Suchmaschine Bibliothek geschrieben, um den Fall zu lösen, wie Sie, vielleicht können Sie einen Blick darauf werfen ... https: //github.com/enix223/djolar .. – Enix