我想做一个基本的查询搜索。我想使用字段city
和area
来执行数据库查找。
我想要一个案例,如果用户在搜索字段中输入城市和区域,则应返回结果。此外,如果用户输入城市或区域,则应返回结果。
当我在搜索字段中输入城市和区域时,下面的代码没有返回任何结果,并且我有与保存在数据库中的查询相关的对象。相反,它会返回“无结果”。
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')
我甚至尝试使用|
,当我在现场输入城市和地区时,它不会返回任何结果。
我错过了什么?
答案 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的值分成城市和区域。