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()
我正在为我们的网站编写一个简单的搜索,我需要根据一些条件过滤条目。但是,如果不满足最严格的过滤条件,我想 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()