我想搜索一个句子中的每个单词并将其放在result['post']
字典中
当然这段代码只查找最后一个查询
queries = querystring.split()
for query in queries:
results['posts'] = Post.objects.filter(text__icontains=query)
我尝试了append
,extend
以及很多事情,但它并没有像预期的那样发挥作用。
修改更新 我也试过
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)
同样Post.objects.filter(text__icontains=query)
此行返回一个查询集值,Queryset type of django似乎没有追加。它有自己的追加功能吗?如果是这样,则不会将其查询集类型更改为列表。使用temp
变量(post_results = []
更改列表。
我们可以将该列表更改回queryset吗?如果我们可以,那就行了。
答案 0 :(得分:1)
我猜原因是每个for循环都会覆盖results['posts']
值。
如何更改代码
queries = querystring.split()
tmp = []
for query in queries:
tmp.append(Post.objects.filter(text__icontains=query))
results['posts'] = tmp
答案 1 :(得分:1)
我们可以使用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()
答案 2 :(得分:0)
这个怎么样:
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 objects。
results = {}
count = {'posts': []}
from django import models
qobjects = models.Q()
for query in querystring.split():
qobjects |= models.Q( ('text__icontains',query) )
results['posts'] = Post.objects.filter(qobjects)
counts['posts'] = results['posts'].count()
答案 3 :(得分:0)
谢谢大家,我先尝试了一切,最后得到了解决方案
我一开始做了一件疯狂的事。
我想为results['posts']
定义一个空的查询集,所以我做了一个糟糕但工作的方式results['posts']=Post.objects.filter(text_icontains='sth_that_will_never_b_true')
我用了
并解决了问题,然后研究了将空QuerySet定义为
的真正方法很高兴最后的代码是
count = {}
results = {}
results['posts']=Post.objects.none()#This line is LOVE for me
queries = querystring.split()
for query in queries:
results['posts'] = results['posts'] | Post.objects.filter(
text__icontains=query)
count['posts'] = results['posts'].count()
现在一切都按预期工作了。