1

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?

+1

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. –

+1

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

Antwort

1

Sie müssen den neuen Filter dafür definieren. Als Bezug auf django-Filter Ausgabe https://github.com/carltongibson/django-filter/issues/137

from django_filters import Filter 
from django_filters.fields import Lookup 

class ListFilter(Filter): 
    def filter(self, qs, value): 
    return super(ListFilter, self).filter(qs, Lookup(value.split(u","), "in")) 

Haben Sie, die beiden Werte Pune & Nashik in get_queryset Methode?

Hinweis: -

Aktualisiert

Wolke Sie bitte diesen Code versuchen, um beide Wert den Kreis zu erhalten.

fields = request.query_params.get('district ') 
    if fields: 
     fields = fields.split(',') 
     dis = set(fields) # dis is a set of all request param value. 
+0

Ich habe diesen Code, den Sie mir früher gegeben , aber ich möchte dies mit get_query set schreiben –

+0

Ich benutze nicht Django Restframework Backend-Filter. Ich möchte Code schreiben. –

+0

Update-Code funktioniert nicht. –

Verwandte Themen