DjangoHaystack:是否应该使用RealtimeSignalProcessor不触发更新?

2024-04-25 14:03:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模型,它有一个布尔字段,用来说明模型对象是否处于活动状态。我基本上希望Haystack忽略任何带有active=False的对象。对于使用以下方法进行完整的重新索引,此方法效果良好:

def index_queryset(self, using=None):
    return ExampleModel.objects.filter(active=True)

但是,当对象更新且索引实时更新且未完全重新编制索引时(例如,将对象更改为非活动对象时),以下操作将不起作用,而且似乎没有调用:

^{pr2}$

当对象被标记为不活动时,我希望将其从索引中删除,但是在将对象更新为不活动时,它仍保留在索引中影响方面计数等。我使用管理.py更新索引而should\u更新代码似乎没有运行?在

我正在使用haystack dev和elasticsearch的最新稳定。在

有什么想法吗?在


Tags: 对象方法模型selfnonefalseindexreturn
2条回答
  1. 创建信号.py应用程序目录中的文件
  2. 编辑信号.py公司名称:

    from haystack import signals
    from .models import Product
    from haystack.exceptions import NotHandled
    
    class ProductUpdateSignalProcessor(signals.RealtimeSignalProcessor):
    
        def handle_save(self, sender, instance, **kwargs):
            if isinstance(instance, Product):
                using_backends = self.connection_router.for_write(instance=instance)
                for using in using_backends:
                    try:
                        index = self.connections[using].get_unified_index().get_index(sender)
                        if instance.active:
                            index.update_object(instance, using=using)
                        else:
                            index.remove_object(instance, using=using)
                    except NotHandled:
                        print(NotHandled.message)
            else:
                super(ProductUpdateSignalProcessor, self).handle_save(sender, instance, **kwargs)
    
  3. 编辑设置.py公司名称:

    HAYSTACK_SIGNAL_PROCESSOR = 'products.signals.ProductUpdateSignalProcessor'
    

查看源代码,^{}默认返回True,这意味着重新编制索引。另外,^{}被附加到类的post delete钩子上,这可能就是为什么没有调用它,因为您没有删除记录。在

您应该能够通过如下方式稍微修改代码来触发索引删除:

def should_update(self, instance, **kwargs):
    if instance.active:
        return True
    else:
        self.remove_object(instance, **kwargs)
        return False

或者反过来:

^{pr2}$

另一个选择是创建一个CRON脚本,它可以:

import haystack
from yourapp.models import ExampleModel

for obj in ExampleModel.objects.filter(active=False):
    haystack.site.remove_object(obj)

这也可以由Django中的^{}信号使用。在

细节:我已经没有测试过这段代码的任何。它是基于问题中提供的信息进行的。在

相关问题 更多 >