如何让 django 中的 Q 查找查找多个值

Posted

技术标签:

【中文标题】如何让 django 中的 Q 查找查找多个值【英文标题】:How to make Q lookups in django look for multiple values 【发布时间】:2017-02-09 08:39:27 【问题描述】:

目前我有一个非常简单的搜索选项,它会遍历我的页面并通过多个字段查找请求的查询。如果我在其中输入一个单词,它工作得很好,但是如果我在搜索查询中输入多个单词,我什么也得不到,即使一个页面包含所有属性。例如,如果我搜索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()

【问题讨论】:

【参考方案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。

【讨论】:

好吧,在这个问题上停留了几天之后,我决定改用一个包。 Haystack 似乎完美地完成了这项工作。我对使用包犹豫不决的原因是,这个项目也是我自己从零开始学习 django 并自己开发应用程序的方式。然而,搜索整个网站及其所有应用程序内容非常复杂,现在我将使用 pacakge,并将搜索和索引留待以后自行处理。感谢您的建议。 from functools import reduce

以上是关于如何让 django 中的 Q 查找查找多个值的主要内容,如果未能解决你的问题,请参考以下文章

带有 DRF 的 Django-filter - 如何在使用相同查找应用多个值时执行“和”?

excel FIND查找多个不同字符串 位置

如何在C++ STL的queue当中查找一个元素?

在Django Q对象中查找最新日期

Django 1.9 在列表中查找属性等于某个值的对象

如何编写查询以在 django 的 json 字段中查找值