J'utilise get_queryset avec Django-REST-Framework pour créer des API pour mon application.en utilisant django-rest-framework comment la requête fonctionne pour les champs de liste?
Je voudrais savoir s'il y a un moyen d'obtenir ce filtre de travail
http://api/data?district=Nasik,Pune
pour obtenir toutes les données avec le district « Pune » OR quartier « Nasik ». J'ai essayé avec
http://api/data?district=Nasik&district=Pune mais comme prévu, il fait un ET entre les filtres et récupérer uniquement le district de Pune (je suppose parce que c'est le dernier filtre).
Voici mon 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
donc, ce code de travail pour deux champs différents,
par exemple:
http://api/?data?fruit=Banana&district=Pune
http://api/?data?fruit=Banana&taluka=Haveli
http://api/?data?taluka=Haveli&district=Pune
tous travaillent mais,
http://api/data?district=Nasik,Pune
cela ne fonctionne pas, ici, j'utiliser ce code pour "OU"
if district or district:
queryset_list = queryset_list.filter(
Q(district__icontains=fruit)
|Q(district__icontains=district)
)
return queryset_list
mais il ne fonctionne pas, une idée résoudre cela?
j'ai répondu une autre question sur la façon de résoudre la liste des paramètres récemment, vous trouverez peut-être utile à la résolution de votre liste de mots de filtre: http://stackoverflow.com/a/41335388/7120972. En outre, vous pouvez résoudre votre liste de constructeurs de requêtes (objets Q) d'une manière plus facile: http://stackoverflow.com/a/26613698/7120972. –
J'ai écrit une bibliothèque de moteur de recherche django pour résoudre le cas comme le vôtre, peut-être vous pouvez y jeter un coup d'oeil ... https: //github.com/enix223/djolar .. – Enix