编程语言
首页 > 编程语言> > python – 在Haystack搜索中排除对象而不需要update_index

python – 在Haystack搜索中排除对象而不需要update_index

作者:互联网

我需要Haystack搜索来排除一些值已发布= False的对象,到目前为止我管理它的方式是添加一个exclude(published = True),如下所示:

class MymodelIndex(indexes.RealTimeSearchIndex, indexes.Indexable):
    def get_queryset(self):
        return Mymodel.objects.all().exclude(published=False)

它按预期工作,问题是我每次将新对象添加到数据库时都需要./manage.py rebuild_index,这使得它很糟糕.

如何在不需要运行任何其他东西的情况下制作它?

笔记:

Haystack的索引适用于许多模型,如下所示:

search = (
    SearchQuerySet().filter(content=term)
)

返回多种对象而不仅仅是一种模型.

谢谢

解决方法:

我最近不得不做类似的事情,这是一个痛苦的屁股.我找不到任何其他方法来做到这一点.

首先解决Haystack在许多模型上工作的问题,因此过滤器返回所有匹配:

Haystack使用其索引名为django_ct的属性处理幕后模型过滤,该属性等于应用程序名称和模型名称.在我的特殊情况下,它看起来像django_ct =’books.Title’.

您可以尝试过滤

SearchQuerySet.filter(content=term, django_ct='app.Model')

但我不知道它是否会以这种方式运作.在我的特殊情况下,我不得不做一个原始搜索,所以我能够直接添加过滤:

sqs = SearchQuerySet()
sqs = sqs.raw_search(u'(title:(%s)^500 OR author:"%s"^400 OR "%s"~2 OR (%s)) AND (django_ct:books.Title)' % term)

无论你如何得到它,在你想要在不更新索引的情况下进行额外过滤的SearchQuerySet之后,你必须使用自己的代码来完成它.

# each item in a queryset has a pk property to the model instance it references
pks = [item.pk for item in list(sqs)] # have to wrap sqs in a list otherwise it causes problems

# use those pks to create a standard django queryset object
results = Model.objects.filter(pk__in=pks)

# Now you can do any additional filtering like normal
results = results.exclude(published=False)

当然,您可以将最后两个查询组合在一起,我只是将它们拆分为显式.

这不是那么多代码,但是由于各种原因我花了很长时间才使它工作.希望它可以帮助你.

标签:python,django,django-haystack
来源: https://codeday.me/bug/20190517/1122888.html