我有一个模型,它有一个 bool 字段,用于说明模型对象是否处于事件状态。我基本上希望 Haystack 忽略任何 active=False 的对象。这对于使用以下命令进行完整的重新索引效果很好:
def index_queryset(self, using=None):
return ExampleModel.objects.filter(active=True)
但是,当更新对象并且索引实时更新且未完全重新索引时,例如将对象更改为非事件状态时,以下内容不起作用,并且似乎未调用:
def should_update(self, instance):
if instance.active:
return True
self.remove_object(instance)
return False
我希望该对象在被标记为非事件状态时从索引中删除,但是在将对象更新为非事件状态时,它仍然保留在影响面计数等的索引中。我使用manage.py update_index进行了检查,并且should_update代码没有好像跑了?
有关信息,我正在使用 haystack dev 和 elasticsearch 最新稳定版本。
有什么想法吗?
最佳答案
查看源码,should_update()
默认返回 True,这意味着重新索引。此外,remove_object()
附加到类的删除后 Hook ,这可能就是为什么它没有被调用,因为您没有删除记录。
您应该能够通过稍微更改代码来触发索引删除,如下所示:
def should_update(self, instance, **kwargs):
if instance.active:
return True
else:
self.remove_object(instance, **kwargs)
return False
或相反:
def should_update(self, instance, **kwargs):
if not instance.active:
self.remove_object(instance, **kwargs)
return instance.active
另一个选择是创建一个 CRON 脚本来执行以下操作:
import haystack
from yourapp.models import ExampleModel
for obj in ExampleModel.objects.filter(active=False):
haystack.site.remove_object(obj)
这也可以被 post_save
使用Django 中的信号。
细则:我没有测试过此代码的任何。这是基于问题中提供的信息的理论。
关于python - Django-Haystack:should_update 似乎没有用 RealtimeSignalProcessor 触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22428075/