以下是我的models
和manager
课程。我认为问题出在PostingFilterManager
下面。他们在title
和body_text
中搜索关键字的方式是错误的。
我想在下面的keywords
模型的title
和body_text
中查询Postings
的列表。我没有收到任何错误,但同时浏览器上没有显示任何内容。我确信过滤器应该返回一个帖子。
class PostingFilterManager(models.Manager):
def get_by_keywords(self,wordlist):
print "called"
posts=super(PostingFilterManager,self).get_query_set().filter
(Q(body_text__in=wordlist) | Q(title__in=wordlist))
print posts
return posts
class Postings(models.Model):
carinfo=models.ForeignKey('CarInfo')
title = models.CharField(max_length=100, blank=True)
body_text = models.TextField(blank=True)
objects=models.Manager()
filters=PostingFilterManager()
def __unicode__(self):
return unicode(self.website)
my view:
def detail(request,year):
result=Postings.filters.get_by_keywords(['hello'.'world','clean'])
return HttpResponse(result)
答案 0 :(得分:1)
由于您构建查询的方式,这不起作用。让我们分析一下你的问题:
filter(Q(body_text__in=wordlist) | Q(title__in=wordlist))
您似乎想在内容和标题中搜索关键字。但body_text__in=wordlist
表示如果您的整个文本将是“hello”或“world”或“clean”,则会满足过滤器。我的假设是,这不是你想要的。相反,您正在寻找的是迭代关键字并使用__contains
条件。我有很长一段时间没有写过Django查询,所以我会编写一些丑陋的代码,这些代码可能会提出一般性的想法:
full_query = null
for keyword in wordlist:
if full_query is null:
full_quey = Q(body_text__contains=keyword) | Q(title__in=keywords)
else:
full_query = full_query | (Q(body_text__contains=keyword) | Q(title__in=keywords))
posts=super(PostingFilterManager,self).get_query_set().filter
(Q(body_text__in=wordlist) | Q(title__in=wordlist))
另外,还有其他建议。你在这里做的是全文搜索,你正在做的可能不是最好的方法。可能更好的方法是构建索引并搜索索引。
考虑阅读有关全文搜索的维基百科文章,尤其是索引:http://en.wikipedia.org/wiki/Full_text_search