1

我正在使用get_queryset和Django-REST-Framework爲我的應用程序構建API。使用Django的其餘框架如何查詢適用於列表字段?

我想知道如果有一種方式來獲得此過濾器的工作

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

這是行不通的, 這裏我用這個代碼爲 「OR」

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

您必須爲此定義新過濾器。 作爲參考Django的過濾問題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方法有兩個值普納&納西克?

注: - 更新

雲請你爲了得到這兩個區值試試這個代碼。

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設置 –

+0

我沒有使用django restframework後端過濾器。我想用代碼編寫。 –

+0

更新代碼不起作用。 –

相關問題