1

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?

+1

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

+1

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

Répondre

1

Vous devez définir le nouveau filtre pour cela. En référence à problème django-filtre 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")) 

Avez-vous obtenu à la fois la valeur Pune & Nashik dans la méthode get_queryset?

Note: - Mise à jour

Nuage vous essayez s'il vous plaît ce code afin d'obtenir à la fois la valeur du district.

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

J'ai utilisé ce code que vous m'avez donné plus tôt , mais je veux écrire cela en utilisant get_query set –

+0

Je n'utilise pas le filtre backend django restframework. Je veux écrire en code. –

+0

le code de mise à jour ne fonctionne pas. –