抱歉,如果我的问题很奇怪或语无伦次。
我想做的是:
我将用户输入的字符串作为搜索输入,并根据该输入创建一个字符串列表,然后创建一个循环来遍历该列表并搜索数据库中该列表中的每个项目,让我用一些代码让它更清楚一点:
#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: blablabla”,但用户搜索“Barack Obama”,则文章“Obama: blablabla”实际上不会出现在全部。
问题是,当我执行循环搜索时,如果我的搜索查询是 “Obama Obama Obama”,我会得到一个列表,其中每篇文章都不是重复的,而是三次的(我想我编了这个词)。 如果我搜索“Obama Obama Obama Obama”,我会得到每篇文章的四倍(同一篇文章 4 次)等等。我希望你明白我的意思。
我通过仅获取最终列表来解决这个问题一段时间,在我的例子中是 searchnews 并使用内置的 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
如果您想坚持使用当前代码,请尝试从查询中删除重复项,即 query_srch = list(set(query.split()))
,这样如果您输入“Obama Obama Obama "在 query_srch
关于python - Django Q 在标题中查找列表中的字符串返回重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48160172/