python Django append< queryset>用于使用filter搜索句子中的每个单词

stszievb  于 2023-05-05  发布在  Python
关注(0)|答案(4)|浏览(159)

我想搜索句子中的每个单词,并将其放入result['post']字典中,当然,这段代码只查找最后一个查询

queries = querystring.split()
    for query in queries:
        results['posts'] = Post.objects.filter(text__icontains=query)

我尝试了appendextend和很多东西,但它没有像预期的那样工作。

**编辑更新:**我也试过

count = {}
    results = {}
    post_results = []
    queries = querystring.split()
    for query in queries:
        post_results.append(Post.objects.filter(text__icontains=query))
    results['posts'] = post_results
    count['posts'] = results['posts'].count()

但这会导致另一个错误count() takes exactly one argument (0 given)
Error Image
另外,Post.objects.filter(text__icontains=query)这一行返回一个queryset值,而Queryset type of django似乎没有append。有没有自己的append like特性?如果是这样的话,那么这不会改变它的查询集类型为列表。使用temp变量(如post_results = [])更改为list。
我们能把这个列表改回queryset吗?如果我们能,那就行得通了。

zaq34kh6

zaq34kh61#

我猜原因是results['posts']值在每个for循环中都被覆盖了。
如何更改代码,如

queries = querystring.split()
tmp = []
for query in queries:
        tmp.append(Post.objects.filter(text__icontains=query))
results['posts'] = tmp
nkoocmlb

nkoocmlb2#

我们可以使用Q对象来代替多次查询,下面是一个简单的例子

q = 'query string'
keywords = []
prevword = ""
for word in q.split(' '):
    prevword = prevword + word + " "
    keywords.append(prevword.lower())

query = Q(title__icontains=q)
for keyword in keywords:
    query.add(Q(title__icontains=keyword), Q.OR)

services = Service.objects.distinct().filter(query).all()
ezykj2lf

ezykj2lf3#

不如这样:

results = {'posts': []}
count = {'posts': []}
for query in querystring.split():
    qs = Post.objects.filter(text__icontains=query)
    results['posts'].append(qs)
    counts['posts'].append(qs.count())

更新后,你回答了自己的问题:
哦,我假设你想要一个每个单词的查询列表,以及它们各自的结果计数。如果您只想将搜索词的每个字符串组合成一个OR查询,则可以使用Q对象。

results = {}
count = {'posts': []}

from django.db.models import Q
qobjects = Q()
for query in querystring.split():     
    qobjects |= Q( ('text__icontains',query) )
 results['posts'] = Post.objects.filter(qobjects)
 counts['posts'] = results['posts'].count()
6mzjoqzu

6mzjoqzu4#

谢谢你们所有人,我尝试了最初提到的一切,终于得到了解决方案

  • 一开始我做了件疯狂的事 *

我想为results['posts']定义一个空的查询集,所以我做了一个不好的但有效的方法
results['posts']=Post.objects.filter(text_icontains='sth_that_will_never_b_true')
我用了
Django Merge QuerySets
并解决了这个问题,然后后来研究了真正的方法来定义空QuerySet为
django.db.models.query.QuerySet.none
最后的代码是

count = {}
results = {}
results['posts']=Post.objects.none() # empty QuerySet
queries = querystring.split()
for query in queries:
    results['posts'] = results['posts'] | Post.objects.filter(
        text__icontains=query)

count['posts'] = results['posts'].count()

现在一切都按预期工作。

相关问题