我正在使用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
,但它不工作,任何想法如何解決這個問題?
我回答瞭如何解決的參數列表最近,你會發現它與解決您的過濾詞表中有用的另一個問題:http://stackoverflow.com/a/41335388/7120972。此外,您可以用簡單的方式解析查詢構建器(Q對象)列表:http://stackoverflow.com/a/26613698/7120972。 –
我已經寫了一個Django搜索引擎庫來解決像你這樣的情況,可能你可以看看它... https://github.com/enix223/djolar .. – Enix