1

Я использую get_queryset с Django-REST-Framework для создания API для моего приложения.с использованием django-rest-framework, как работает запрос для полей списка?

Я хотел бы знать, если есть способ, чтобы получить этот фильтр работает

http://api/data?district=Nasik,Pune

, чтобы получить все данные с районом «Пуной» или район «Назиком». Я попытался с

http://api/data?district=Nasik&district=Pune , но, как и ожидалось, что делает и между фильтрами и получать только район Пуна (я предполагаю, потому что это последний фильтр).

Вот мой код:

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 

так, этот код работает на двух различных областях,

, например:

http://api/?data?fruit=Banana&district=Pune

http://api/?data?fruit=Banana&taluka=Haveli

http://api/?data?taluka=Haveli&district=Pune

все работают, но,

http://api/data?district=Nasik,Pune

это не работает, здесь я использую этот код для "ИЛИ"

if district or district: 
    queryset_list = queryset_list.filter(
     Q(district__icontains=fruit) 
     |Q(district__icontains=district) 
    ) 
    return queryset_list 

, но это не работает, никакого понятия, как решить это?

+1

Я ответил на другой вопрос о том, как решить список параметров в последнее время, вы могли бы найти его полезным при решении вашего списка фильтра слов: http://stackoverflow.com/a/41335388/7120972. Кроме того, вы можете разрешить список конструкторов запросов (объектов Q) в упрощенном режиме: http://stackoverflow.com/a/26613698/7120972. –

+1

Я написал библиотеку поисковых систем django, чтобы решить случай, подобный вашему, может быть, вы можете взглянуть на него ... https: //github.com/enix223/djolar .. – Enix

ответ

1

Для этого вам необходимо определить новый фильтр. В вопросе ссылки на Джанго фильтра 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")) 

Вы получили оба значение Пуны & Нашика в get_queryset методы?

Примечание: - Обновлен

Cloud, пожалуйста, попробуйте этот код, чтобы получить как значение района.

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

Я использовал этот код, который вы мне дали раньше , но я хочу написать это, используя get_query set –

+0

Я не использую backend-фильтр django restframework. Я хочу писать в коде. –

+0

код обновления не работает. –

Смежные вопросы