如何在django中进行Q查找可以查找多个值

时间:2016-09-30 17:37:57

标签: python django search 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() ,我将不会得到空查询,即使有一个带有标题测试的页面,内容测试和作者管理员。有没有办法扩展搜索以单独查找搜索查询中的每个单词?

csv

1 个答案:

答案 0 :(得分: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()

但是,此时以这种方式进行搜索会有点混乱。如果您的应用增长并且您需要搜索多个模型,请考虑查看外部搜索包,例如Haystack