如何使 Django 中的 Q 查找查找多个值
How to make Q lookups in django look for multiple values
目前我有一个非常简单的搜索选项,它遍历我的页面并在多个字段中查找请求的查询。如果我在其中输入一个单词,它工作得很好,但是如果我在搜索查询中输入多个单词,我什么也得不到,即使一个页面包含所有属性。例如,如果我搜索 test admin
,我不会得到空查询,即使有一个带有标题测试、内容测试和作者管理员的页面。有没有办法扩展搜索以单独查找搜索查询中的每个词?
# 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()
您要求的内容类似于以下内容,您可以在其中按查询中的每个单词进行过滤:
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.
目前我有一个非常简单的搜索选项,它遍历我的页面并在多个字段中查找请求的查询。如果我在其中输入一个单词,它工作得很好,但是如果我在搜索查询中输入多个单词,我什么也得不到,即使一个页面包含所有属性。例如,如果我搜索 test admin
,我不会得到空查询,即使有一个带有标题测试、内容测试和作者管理员的页面。有没有办法扩展搜索以单独查找搜索查询中的每个词?
# 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()
您要求的内容类似于以下内容,您可以在其中按查询中的每个单词进行过滤:
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.