python - Django-Haystack:should_update 似乎没有用 RealtimeSignalProcessor 触发?

标签 python django elasticsearch django-haystack

我有一个模型,它有一个 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/

相关文章:

python - 如何将参数传递给 python fabric 自定义任务

node.js - node.js 中的 "EIO: i/o error, write"是什么,我该如何消除它?

elasticsearch - Elasticsearch堆被填充以进行简单搜索

django - 带有django-haystack的Elasticsearch自动运行更新索引

python - 如何获取 current_app 以便在多部署可重用 Django 应用程序中反向使用?

python - Django 和 virtualenv - 添加到 git repo

python - 获取切片后 Django 无法更新查询

python - 如何使用 scipy 查找优化函数的参数?

python - Numpy 以不同于 python 的方式循环

python - Django 模型过滤