Django Q查找列表中字符串的标题搜索返回重复项

时间:2018-01-09 01:07:47

标签: python django database list django-models

抱歉,如果我的问题很奇怪或不连贯。

我想做的是:

我将用户输入的字符串作为他的搜索输入并从该输入创建一个字符串列表,然后创建一个循环遍历列表并在数据库中搜索该列表中的每个项目,让我用一些代码使它更清晰:

#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')

我这样做的原因是因为如果你网站上的文章标题是“奥巴马:blablabla”,但是用户搜索“巴拉克奥巴马”,那么文章“奥巴马:blablabla”实际上不会出现在所有

问题在于,当我为循环搜索事件执行此操作时,如果我的搜索查询是 “奥巴马奥巴马奥巴马”,我会得到一份清单,每篇文章都没有重复但是重复(我想我已经提到了这个词)。 如果我搜索“奥巴马奥巴马奥巴马奥巴马”,我会得到每篇文章(同样的文章4次)等等。我希望你明白我的意思。

我只是采取了我的情况下的结束列表来解决这个问题 searchnews 并使用内置的python函数set(),如下所示:

searchnews = set(searchnews)

但这改变了列表中项目的顺序,我需要按日期排序。

你有什么机会可以帮忙吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

有几种方法可以处理这种情况。

方法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