Django附加<queryset>,用于使用过滤器搜索sentece中的每个单词

时间:2018-02-17 13:22:10

标签: python django django-queryset

我想搜索一个句子中的每个单词并将其放在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 type of django似乎没有追加。它有自己的追加功能吗?如果是这样,则不会将其查询集类型更改为列表。使用temp变量(post_results = []更改列表。

我们可以将该列表更改回queryset吗?如果我们可以,那就行了。

4 个答案:

答案 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')
我用了

  

Django Merge QuerySets

并解决了问题,然后研究了将空QuerySet定义为

的真正方法
  

django.db.models.query.QuerySet.none

很高兴最后的代码是

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()

现在一切都按预期工作了。