使用 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()orandif 语句将导致执行查询。如果 至少有一个结果,QuerySetTrue,否则为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)

Django 中的 get_list_or_404 和 get_object_or_404 之间的确切区别是啥?

Django 模型查询中的 OR 运算符

Django SQL OR via filter() & Q(): 动态?