Django查询:返回一个将转换为“Q”的Q对象;和(……)”;

Django查询:返回一个将转换为“Q”的Q对象;和(……)”;,django,django-models,django-orm,django-q,Django,Django Models,Django Orm,Django Q,我正在为我们的网站写一个简单的搜索,我需要根据一些标准过滤条目。但是,如果不满足最严格的筛选,我希望返回不太严格的搜索结果。为此,我想创建一些查询对象,每个对象都有一个以上的过滤器,然后向后迭代以获得结果,并返回通过这种方式得到的第一个结果 我正在做的是: q0 = MyIndex.objects.in_city(city_id) q1 = q0.filter(name_contains(words)) 在哪里 当我传递数据库中不存在的单词时,仍然会得到一个结果,因为name\u contai

我正在为我们的网站写一个简单的搜索,我需要根据一些标准过滤条目。但是,如果不满足最严格的筛选,我希望返回不太严格的搜索结果。为此,我想创建一些查询对象,每个对象都有一个以上的过滤器,然后向后迭代以获得结果,并返回通过这种方式得到的第一个结果

我正在做的是:

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

当我传递数据库中不存在的单词时,仍然会得到一个结果,因为
name\u contains
返回的查询部分是通过
附加的,而不是


是否有一种方法可以返回该查询,以便它总是通过
附加到查询的其余部分?

除非您有一个奇怪的对象管理器,否则城市
中的
可能会包装到
.filter(..)

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

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

print(str(q0.filter(name_contains(words)).query))

|
替换为
&
@WillemVanOnsem我需要将此查询中的部分连接为“或”。也就是说,我需要查询以“…where city_id=3和(单词如“%1%”或单词如“%2%”结束,除非你的
in_city
过滤器有一些非常奇怪的逻辑,它将已经执行这样的查询。你可以通过打印
print(str(MyIndex.objects.in_city(city_id)).filter(name_contains(words)).query))来调查这一点
。你能用你的
在_city
参考中发布经理的代码吗?我需要将此查询中的部分加上“或”。也就是说,我需要查询以“…”结尾。。。当city_id=3和(像“%1%”这样的单词或像“%2%”这样的单词)仔细检查我的代码后,我意识到,我没有传递一个单词列表,而是传递了一个单词,并且,由于字符串是可iterable的,单词被分成了字符,因此我得到了错误的结果。@Ibolit:是的,字符串也是一个可iterable字符。不幸的是,这经常导致错误:s。
print(str(q0.filter(name_contains(words)).query))
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()