Django-haystack - 如何只搜索一部分项目?

时间:2014-04-21 20:20:57

标签: python django elasticsearch django-haystack

我有一些项目,我正在使用Django-haystack(elasticsearch后端)进行索引以进行搜索。这很好用,但用户可以收藏这些项目,我希望用户能够搜索他们的收藏,就像他们能够搜索所有项目一样。最喜欢的是通过关系表示多对多,因为我需要在用户收藏项目时记录时间。是否有任何方法可以使用haystack搜索用户收藏夹?我不想为每个用户的收藏夹生成单独的索引,因为它们将是还原的,因为这些项目是相同的并且已经由主索引编制索引。以下是我的模型和搜索索引的参考资料:

class Gallery(models.Model):   
    faves = models.ManyToManyField(
        User, through='Favorite', null=True, related_name="faves")

class Favorite(models.Model):
    user = models.ForeignKey(User)
    gallery = models.ForeignKey(Gallery)
    date = models.DateField(auto_now_add=True)

    class Meta:
        ordering = ["date"]

class GalleryIndex(indexes.SearchIndex, indexes.Indexable):

    def get_model(self):
        return Gallery

感谢。

1 个答案:

答案 0 :(得分:0)

您需要查看RelatedSearchQuerySet(http://django-haystack.readthedocs.org/en/latest/searchqueryset_api.html#relatedsearchqueryset)。请务必阅读页面上有关性能影响的警告;我只是试过这个,它明显慢于大多数查询。

你会想要这样的东西:

from django.contrib.auth.models import User
from haystack.query import RelatedSearchQuerySet
from .models import Gallery

u = User.objects.get(...)
sqs = RelatedSearchQuerySet().load_all()
sqs = sqs.load_all_queryset(Gallery, u.faves.all())

这应该会给你一个只包含用户收藏夹的SearchQuerySet,你可以进一步过滤和搜索。