对不起,如果我的问题奇怪或语无伦次。
我要做的是:
我将用户键入的字符串作为搜索输入,并从该输入创建一个字符串列表,然后创建一个循环,遍历该列表并在数据库中搜索该列表中的每个项,让我使用一些代码使其更清晰:
#I take the string that the user inputs as his search
query = request.GET.get('q')
# I create a list by spliting the original search string
query_srch = query.split()
# Create a list which will later hold the items returned by the db lookup
searchnews = []
#start the loop to lookup
for word in query_srch:
if word:
searchnews += NewsPost.objects.filter(
Q(title__icontains=word)
).distinct().order_by('-date')
我这样做的原因是,如果你网站上的文章标题是“obama:blabla”,但用户搜索的是“barack obama”,那么“obama:blabla”这篇文章实际上根本不会出现。
问题是,当我为循环搜索执行此操作时,如果我的搜索查询是
“奥巴马奥巴马”,我会得到一份清单,每一篇文章都不是重复的,而是三倍的(我想我是编出来的)。
如果我搜索“Obama Obama Obama”,我会把每一篇文章都翻四遍(同一篇文章4遍)等。我希望你明白我的意思。
我做了一段时间的工作,只做了最后的清单,在我的情况下是
搜索新闻并使用内置的python函数set(),如下所示:
searchnews = set(searchnews)
但这会改变列表中项目的顺序,我需要按日期排序。
你能帮忙吗?提前谢谢。
最佳答案
处理这种情况有两种方法。
方法1:(我们可以避免for循环)
import operator
from django.db.models import Q
search_term = request.GET.get('q')
query = reduce(operator.and_, (Q(title__contains = item) for item in search_term.split()))
posts = NewsPost.objects.filter(query).distinct().order_by('-date')
方法2
如果你想坚持你当前的代码,试着从查询ie中删除重复的代码,
query_srch = list(set(query.split()))
,这样如果你输入“obama obama”,你只会在query_srch
中得到一个“obama”。