Django查询查询使用Q不返回正确的结果

时间:2016-08-08 17:13:39

标签: python django

我想做一个基本的查询搜索。我想使用字段cityarea来执行数据库查找。

我想要一个案例,如果用户在搜索字段中输入城市和区域,则应返回结果。此外,如果用户输入城市或区域,则应返回结果。

当我在搜索字段中输入城市和区域时,下面的代码没有返回任何结果,并且我有与保存在数据库中的查询相关的对象。相反,它会返回“无结果”。

def my_search(request):
    try:
        q= request.GET['q']
        hots= Place.objects.filter(Q(city__icontains=q)&Q(area__icontains=q))
        c_hos=hots.count()
        return render(request, 'search/own_search.html',{'hots':hots, 'q':q, 'c_hos':c_hos})
     except KeyError:
         return render(request, 'search/own_search.html')

我甚至尝试使用|,当我在现场输入城市和地区时,它不会返回任何结果。

我错过了什么?

2 个答案:

答案 0 :(得分:1)

一般来说,filter()中的所有kwargs都是AND,你可以在Django Documentation

中使用Q了解更多关于复杂查找的信息
# For performing OR operation
hots= Place.objects.filter(Q(city__icontains=q) | Q(area__icontains=q))

# For performing AND operation
hots= Place.objects.filter(Q(city__icontains=q), Q(area__icontains=q))

也应该没有任何问题。

编辑:

如果请求中的变量“q”在单个变量中包含city和area,则由于您使用的逻辑不合适,因此不会返回任何内容。

假设一个表

State                City
California           San Francisco

然后,如果在你的q =“加利福尼亚旧金山”,那么整个查询都不匹配任何东西。

__icontains适用于此类

q = "San" # Or q = "Franscisco"
result = Place.objects.filter(Q(state__icontains=q) | Q(city_icontains=q))

然后结果将是具有state = California和city = San Franscisco的对象。

您可以轻松使用相同的逻辑,但尝试进入城市或地方以便使用它。这会简单得多。

重新编辑:

如果您想过滤字符串中的每个单词,可以尝试使用它:

list = str(q).split()
result = Place.objects.filter(reduce(operator.and_, (Q(place__contains=x) | Q(city__contains=x) for x in list)))
# Adding .distinct() to the filter might clean the QuerySet and remove duplication in this scenario.

答案 1 :(得分:1)

你应该使用或运营商“|”如果您只想接受城市或区域的查询。我建议你从请求中取出后打印变量q,看看它里面有什么,然后再次进行数据库查询。另一个想法是,你应该将q的值分成城市和区域。