我们正在尝试返回Django API的标题列表,其中的标题可以有几个关键字。
例如,如果我们使用__icontains
方法搜索“金钱”和“世界”(api.com/?keyworld=money&keyword=world
),它将返回包含金钱、世界或两者的所有记录。
相关的SQL语句为:
select * from news
where news_source = 1 or news_source = 2
and news_title like '%money%' or news_title like '%world%'
我们尝试使用此代码来允许用户拥有__icontains
的多个关键字以及多个源,因此最终目标是:
api.com/?keyworld=money&keyword=world&source=1&source=2
我们的代码:
def get_queryset(self):
queryset = News.objects.all()
title = self.request.query_params.getlist('title')
source = self.request.query_params.getlist('source')
if title:
queryset = queryset.filter(news_title__icontains=title, news_source__in=source)
return queryset
问题是,如果使用了第二个关键字,这只会返回第二个关键字,而不是在&keyword=
中键入的关键字之前返回其他关键字。
发布于 2018-06-26 23:34:11
我可以通过在get_querset()
函数中创建两个单独的函数来解决这个问题,该函数在发出GET请求时调用。
def get_queryset(self):
queryset = News.objects.all()
source_list = self.request.query_params.getlist('source')
keyword_list = self.request.query_params.getlist('title')
if source_list or keyword_list:
def create_q_source(*args):
list = [*args]
source = Q()
for value in list:
source.add(Q(news_source=value), Q.OR)
return source
def create_q_keyword(*args):
list = [*args]
keyword = Q()
for value in list:
keyword.add(Q(news_title__icontains=value), Q.OR)
return keyword
queryset = queryset.filter(create_q_source(*source_list),create_q_keyword(*keyword_list))
return queryset
编辑:当您进入接口链接并传入参数时,将根据传入的内容进行过滤:
http://127.0.0.1:8000/api/notes/?keyword=trump&keyword=beyond&keyword=money&source=1
相当于的SQL语句:
select * from news where news_source = 1 AND news_title like '%beyond%' OR news_title like '%money%'
https://stackoverflow.com/questions/51031397
复制相似问题