我的查询字符串有一个问题,问题是当选择多个值时,我的Django搜索会中断。我在URL中得到这样的结果 ?Query=value1&Query=Value2
. 在这种情况下,只有最后一个值被搜索到。我想发生的情况是,两个值都被搜索到(相当于一个 AND
中间的运算符)。)
这就是我们想要的结果 ?Query=value1+Value2
.
我已经在下面添加了我的使用Select2的搜索表单和我的Django搜索视图。如果你还需要什么,现在就告诉我。
任何帮助将是非常感激的。
前端的搜索表单
<form id="makeitso" role="search" action="" method="get">
<select class="js-example-placeholder-multiple" name="query" multiple="multiple">
<option value="Value 1">Value 1</option>
<option value="Value 2">Value 2</option>
<option value="Value 3">Value 3</option>
</select>
<script>
$(".js-example-placeholder-multiple").select2({
placeholder: "Search here",
});
</script>
<div class="form-inline justify-content-center">
<button type="submit" class="btn btn-xlarge">Search</button>
</div>
</form>
视图.py
def search(request):
search_query = request.GET.get('query', None)
page = request.GET.get('page', 1)
# Search
if search_query:
search_results = TestPage.objects.live().search(search_query)
query = Query.get(search_query)
# Record hit
query.add_hit()
else:
search_results = TestPage.objects.none()
# Pagination
paginator = Paginator(search_results, 3)
try:
search_results = paginator.page(page)
except PageNotAnInteger:
search_results = paginator.page(1)
except EmptyPage:
search_results = paginator.page(paginator.num_pages)
return render(request, 'search/search.html', {
'search_query': search_query,
'search_results': search_results,
})
你需要使用 getlist()
的方法 GET
属性。
比如说。search_query = request.GET.get('query', None)
应该是
search_query = request.GET.getlist('query', None)
然后,你可以像这样循环浏览所有的搜索查询。
for query in search_query:
然后你可以使用 Q Objects
用于更复杂的查询。
q = Q()
for query in search_query:
q |= Q(term=query)
ModelToQuery.objects.filter(q)
https:/docs.djangoproject.comen3.0refrequest-response#django.http.QueryDict.getlist。
https:/docs.djangoproject.comen3.0topicsdbqueries#complex-lookups-with-q-objects。
谢谢大家的建议,确实对我有帮助,但我下面研究出的解决方案是对看到这个问题的人最有帮助的答案。下面的代码完全可以满足我的要求,并且允许搜索多个值。
我能够使用getlist方法,然后使用functools模块(用于高阶函数)与reduce。该操作符允许 and
或 or
,我现在使用的是 and
其中向用户展示了只与所有搜索值相匹配的结果。
花了点时间才到这里,希望对大家有所帮助!
def search(request):
page = request.GET.get('page', 1)
search_query = request.GET.getlist('query' , None)
# searches for results that match all values
query = functools.reduce(operator.and_, (Q(test_body__contains = i) for i in search_query))
search_results = TestPage.objects.filter(query).distinct().order_by('-latest_revision_created_at')
下面的格式应该可以用
#Views.py
Edit: from django.db.models import Q
def get_queryset(query=None):
queryset = []
queries = query.split(" ")
for q in queries:
page = TestPage.objects.filter(
Q(obj1__icontains=q) |
Q(obj2__icontains=q)
).distinct()
for page in pages:
queryset.append(page)
return list(set(queryset))
这样你就可以循环浏览多个不同指标的页面,即页码或字数。(用上面的obj1和obj2表示)
Edit:query = query.split将分割对象(单词或数字)之间的 "空间",这样你就可以在一个大的集合中搜索对象,而这个集合可能有一个以上的段。它将通过把每一个段转化为可搜索列表中的字符串来实现,所以 "page 16 "将变成['page' , '16']。