Django 查询:return 将转换为 "AND (...)" 的 Q 对象

Django queries: return a Q object that will translate to "AND (...)"

我正在为我们的网站编写一个简单的搜索,我需要根据一些条件过滤条目。但是,如果不满足最严格的过滤条件,我想 return 对结果进行不太严格的搜索。为此,我想创建一些查询对象,每个查询对象都有一个过滤器,然后向后迭代它们以尝试获得结果,return 我以这种方式获得的第一个。

我正在做的是:

q0 = MyIndex.objects.in_city(city_id)
q1 = q0.filter(name_contains(words))

哪里

def name_contains(words):
    if not words:
        return Q()
    query = Q(words_contains=words[0])
    for word in word[1:]:
        query = query | Q(words_contains=word)

当我传递数据库中不存在的单词时,我仍然得到一个结果,因为由 name_contains 编辑的查询部分 return 是通过 OR 附加的,并且不是 AND.

有什么方法可以 return 该查询,以便它始终附加到 AND 查询的其余部分?

除非你有一个奇怪的对象管理器,否则 in_city 可能会换行到 .filter(..)

如果你链接多个 .filter(..),那么你已经隐式地在两者之间写了一个逻辑 ,因为你的第一个 filter(..) 实际上已经删除了元素不满足要求,你的第二个过滤器只过滤更多。

您可以通过打印 Django 将执行的底层查询来验证这种怀疑:

print(str(q0.filter(name_contains(words))<b>.query</b>))

请注意,您可以使函数更具声明性,例如:

from functools import reduce
from operator import or_

def name_contains(words):
    if words:
        return reduce(or_, (Q(word_contains=word) for word in words))
    else:
        return Q()