python - Django Q 在标题中查找列表中的字符串返回重复项

标签 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')

我这样做的原因是,如果您网站上的一篇文章标题是“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

中您只能得到一个“Obama”

关于python - Django Q 在标题中查找列表中的字符串返回重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48160172/

相关文章:

python - 检查 Tkinter 按钮是否仍然被点击

python - Django:如何重定向到表单来源的页面

python - 在 Django 中创建通用 View

javascript - 顶部栏中的基础下拉菜单有问题

database - django 我无法使用 2 个外键保存表单

sql - 关于SQL中列相乘的问题

python - 元组的 Numpy 随机选择

python - 如何通过python在选定的Gmail邮箱中存档电子邮件

python - 每次迭代删除字典中的叶节点

php - 数据库搜索减去 "The"前缀