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