我有一个网站将结果存储在django-haystack搜索索引中,并且该搜索索引中的对象可以与用户相关联。
如果在用户与某个结果相关联时,他们具有某些配置文件数据,那么该数据将根据结果存储在搜索索引中。但是,如果用户在将自己与结果相关联后更新其个人资料,则搜索索引永远不会知道更新后的个人资料数据。
因此,我正在寻找一种有效的方法来使用更新的配置文件数据来更新搜索索引中的对象。
我当前的解决方案是在更改某些配置文件数据时触发芹菜任务,然后简单的操作是保存所有相关结果,因为干草堆随后将更新索引。
signals.py
@receiver(post_save, sender=UserProfile)
def post_save_user_profile(sender, instance, **kwargs):
"""
Sync results with search index
"""
# Privacy Settings
if 'avatar' in kwargs['update_fields']:
update_results.delay(instance.pk)
tasks.py
@celery_app.task(bind=True)
def update_results(self, user_profile_id, **kwargs):
"""
Get celery to sync results with the search index
"""
results = Results.objects.filter(owner=user_profile_id)
for r in results:
# sync any data with the search index aka avatars.
r.save()
但是我不喜欢这样,因为感觉您应该只能够使用对象ID来更新索引,而不是使用大量更新来访问数据库。但是是否有某种更新方法可以执行类似的操作?
profile = UserProfile.objects.get(pk=user_profile_id)
SQS().models(Results).filter(owner_id=user_profile_id).update(
avatar=profile.avatar
)
是否有一种类似于SignalProcessor
类的方法将实例传递给索引?