使用Django reduce(or_)-如何将变量为0的不匹配查询存储在变量中

时间:2018-08-06 01:22:43

标签: django django-filter django-q

我有一个函数可以从数据列表中获取用户的输入,并在数据库中搜索与用户输入匹配的所有项目,然后返回数据库中的所有结果:

results = results.filter(
        reduce(or_, (Q(name__icontains=itm.strip()) for itm in query))
    )

我想处理数据库中不存在用户输入的情况。由于results可以解决现有问题,我该如何检查以上代码是否未能找到查询的至少一个匹配结果,并将该查询存储在变量中?例如,如果results在我的数据库中查询以下列表:['one','two','thee'],假设'thee'不在我的数据库中,但另外两个在我的数据库中,我想将字符串“ thee”存储在变量中以供以后使用

3 个答案:

答案 0 :(得分: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")

答案 1 :(得分:0)

您可以为查询添加一个查询:

例如:

query = query.append(Q(name__isnull = True))或总是错误的东西

答案 2 :(得分:0)

而不是尝试执行一段代码:

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

尽管效率不如我所愿,但它现在可以解决问题