2016-09-30 61 views
0

目前我有一个非常简单的搜索选项,它可以浏览我的页面,并通过几个字段查找请求的查询。如果我在其中输入一个单词,它就可以正常工作,但是如果我在搜索查询中输入多个单词,即使单个页面包含所有属性,也不会收到任何内容。例如,如果我搜索test admin,即使有一个包含标题测试的页面,内容测试和作者管理员也不会收到空查询。有没有一种方法可以扩展搜索以单独查找搜索查询中的每个单词?如何在Django中进行Q查找查找多个值

# Fetch all pages and sort them alphabetically 
queryset = Page.objects.all().filter(archived=False).order_by("title") 

# Get search query if applicable 
query = request.GET.get("q") 
if query: 
    queryset = queryset.filter(
     Q(title__icontains=query) | 
     Q(content__icontains=query) | 
     Q(user__username__icontains=query) | 
     Q(user__first_name__icontains=query) | 
     Q(user__last_name__icontains=query) 
    ).distinct() 

回答

1

你问的东西,像下面这样,在你每个单词的查询过滤器:

import operator 

queryset = Page.objects.all().filter(archived=False).order_by("title") 

query = request.GET.get("q") 
if query: 
    words = query.split() 
    fields = ["title__icontains", "content__icontains", "user__username__contains", 
       "user__first_name__icontains", "user__last_name__icontains"] 

    q_expression = [Q(f,w) for f in fields for w in words] 
    queryset = queryset.filter(reduce(operator.or_, q_expression))\ 
         .distinct() 

然而,在这一点上做搜索这种方式得到一点点凌乱。如果您的应用程序增长并且您需要搜索多个模型,请考虑查看外部搜索包,如。

+0

好了,花了几天的时间在这个问题上停滞不前,我决定用一个包来代替。 Haystack似乎完美地完成了这项工作。我对使用软件包犹豫不决的原因是,这个项目也是我自己从头开始学习django并自行开发应用程序的方式。然而,搜索整个网站及其所有应用程序的内容是非常复杂的,现在我将使用pacakge,稍后留下搜索和索引。谢谢你的建议。 – Ablivion