首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >图标和getlist django python

图标和getlist django python
EN

Stack Overflow用户
提问于 2018-06-26 04:32:23
回答 1查看 1.2K关注 0票数 3

我们正在尝试返回Django API的标题列表,其中的标题可以有几个关键字。

例如,如果我们使用__icontains方法搜索“金钱”和“世界”(api.com/?keyworld=money&keyword=world),它将返回包含金钱、世界或两者的所有记录。

相关的SQL语句为:

代码语言:javascript
复制
select * from news
    where news_source = 1 or news_source = 2
        and news_title like '%money%' or news_title like '%world%'

我们尝试使用此代码来允许用户拥有__icontains的多个关键字以及多个源,因此最终目标是:

代码语言:javascript
复制
api.com/?keyworld=money&keyword=world&source=1&source=2

我们的代码:

代码语言:javascript
复制
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=中键入的关键字之前返回其他关键字。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-26 23:34:11

我可以通过在get_querset()函数中创建两个单独的函数来解决这个问题,该函数在发出GET请求时调用。

代码语言:javascript
复制
 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

编辑:当您进入接口链接并传入参数时,将根据传入的内容进行过滤:

代码语言:javascript
复制
http://127.0.0.1:8000/api/notes/?keyword=trump&keyword=beyond&keyword=money&source=1

相当于的SQL语句:

代码语言:javascript
复制
select * from news where news_source = 1 AND news_title like '%beyond%' OR news_title like '%money%'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51031397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档