使用 Django reduce(or_) - 如何将结果为 0 的不匹配查询存储在变量中
Posted
技术标签:
【中文标题】使用 Django reduce(or_) - 如何将结果为 0 的不匹配查询存储在变量中【英文标题】:Using Django reduce(or_) - How can I store an unmatched query with 0 results in a variable 【发布时间】:2019-01-12 22:25:24 【问题描述】:我有一个函数,它从数据列表中获取用户的输入,并在我的数据库中搜索与用户输入匹配的任何项目,并返回我的数据库中的所有结果:
results = results.filter(
reduce(or_, (Q(name__icontains=itm.strip()) for itm in query))
)
我想处理我的数据库中不存在用户输入的情况。由于results
fitlers 已经存在,我如何检查上述代码是否未能找到至少一个匹配的查询结果,并将该查询存储在变量中?例如,如果results
向我的数据库查询以下列表:['one', 'two', 'thee'],假设 'thee' 不在我的数据库中,但其他两个在,我想存储变量中的字符串“thee”以供以后使用
【问题讨论】:
【参考方案1】:您可以简单地将 results
评估为布尔值:
if not results:
print('No match found.')
来自QuerySet
's documentation:
bool()
。在布尔上下文中测试QuerySet
,例如使用bool()
,or
、and
或if
语句将导致执行查询。如果 至少有一个结果,QuerySet
为True
,否则为False
。 例如:if Entry.objects.filter(headline="Test"): print("There is at least one Entry with the headline Test")
【讨论】:
我应该指定的。结果将查询用户给定数据列表中的每个项目。在以下要查询的输入列表的列表中:['one', 'two', 'thee']
例如,如果“thee”不在我的数据库中,我想将该字符串存储在一个变量中。如果“一”或“二”在我的数据库中,则在结果上使用 bool()
将返回 True【参考方案2】:
您可以为查询添加一个查询:
例如:
query = query.append(Q(name__isnull=True)) 或者总是 False 的东西
【讨论】:
【参考方案3】:而不是尝试用一段代码来做:
results = results.filter(
reduce(or_, (Q(name__icontains=itm.strip()) for itm in query))
)
我遍历查询中的每个项目并检查它是否存在
for each in query:
r = results.filter(name__icontains=each)
if r.exists() == False:
Do something with each
虽然没有我想要的效率,但它现在解决了问题
【讨论】:
以上是关于使用 Django reduce(or_) - 如何将结果为 0 的不匹配查询存储在变量中的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 operator.or_ 减少 Django Q 对象似乎会导致使用 'AND' 减少
django:一起使用 select_related 和 get_object_or_404
Django:使用 Q 对象对任意数量的输入进行动态过滤(OR & AND)