【问题标题】:custom manager object not working in Django?自定义管理器对象在 Django 中不起作用?
【发布时间】:2014-05-08 14:50:48
【问题描述】:

这是我的modelsmanager 课程。我认为问题出在下面的PostingFilterManager 中。我在titlebody_text 中搜索关键字的方式是错误的。 我想在下面的Postings 模型的titlebody_text 中查询keywords 的列表。我没有收到任何错误,但同时浏览器上没有显示任何内容。我确信过滤器应该返回一个帖子。

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)

【问题讨论】:

  • ...filter(CarInfo.objects.filter(year__lte=year)) — 你不是说...filter(carinfo__in=CarInfo.objects.filter(year__lte=year))吗?
  • @lanzz:这很有帮助,谢谢。但我有相关的问题,我在这个问题上进行了编辑。我的视图将关键字列表传递给 Manager 对象,它反过来应该过滤这些关键字的标题和正文,我无法正常工作,请帮助
  • 您是在此处复制并粘贴您的代码,还是手动再次输入?因为['hello'.'world','clean'] 会因为'hello''world' 之间的点而引发SyntaxError 异常。

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


【解决方案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

【讨论】:

  • 感谢您的回复。您能否详细说明构造和索引以及搜索索引的含义。或任何解释这一点的链接?谢谢
  • 我添加了维基百科文章,它应该给你一个基本的概述。
猜你喜欢
  • 2013-05-04
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 2023-03-15
  • 2021-09-20
  • 1970-01-01
相关资源
最近更新 更多