自定义管理器对象在Django中不起作用?

时间:2014-03-28 23:13:12

标签: django django-models django-queryset django-filter django-managers

以下是我的modelsmanager课程。我认为问题出在PostingFilterManager下面。他们在titlebody_text中搜索关键字的方式是错误的。 我想在下面的keywords模型的titlebody_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)

1 个答案:

答案 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