【发布时间】:2018-11-18 13:46:32
【问题描述】:
我正在为我们的网站编写一个简单的搜索,我需要根据一些条件过滤条目。但是,如果不满足最严格的过滤,我想返回结果以进行不太严格的搜索。为此,我想创建许多查询对象,每个查询对象都有一个过滤器,然后向后迭代它们以获取结果,并返回我以这种方式得到的第一个。
我正在做的是:
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 返回的查询部分是通过OR 而不是AND 附加的。
有没有办法可以返回该查询,以便它始终通过AND 附加到查询的其余部分?
【问题讨论】:
-
将
|替换为&。 -
@WillemVanOnsem 我需要此查询中的部分由“或”连接。也就是说,我需要查询以“... where city_id=3 and (words like "%one%" or words like "%two%)"
-
除非你的
in_city过滤器有一些非常奇怪的逻辑,否则它已经执行了这样的查询。您可以通过打印print(str(MyIndex.objects.in_city(city_id).filter(name_contains(words)).query))来调查此问题。 -
您可以将经理的代码与您的
in_city参考一起发布吗?
标签: django django-models django-orm django-q