【问题标题】:Django-Haystack : How to limit search to objects owned by user?Django-Haystack:如何将搜索限制为用户拥有的对象?
【发布时间】:2012-08-28 09:01:19
【问题描述】:

我已经成功地让 django-haystack 与 elasticsearch 一起工作。 在下面的示例中,我可以搜索任何销售项目,它会显示在结果中。

我创建了一个索引:

class SalesItemIndex(SearchIndex, Indexable):
    text = CharField(document=True, use_template=True)
    item_description = CharField(model_attr='item_description')

    def get_model(self):
        return SalesItem

    def index_queryset(self):
        """Used when the entire index for model is updated."""
        return self.get_model().objects.all()

模型SalesItem:

class SalesItem(models.Model):        
    item_description    = models.CharField(_(u"Item Description"), max_length=40)
    company             = models.ForeignKey(Company)
    def __unicode__(self):
        return self.item_description

但问题是,用户可以搜索所有销售项目,甚至那些不属于他公司的。

通常不是返回所有salesitems = SalesItem.objects.all(),我宁愿使用它来确保用户只看到属于他公司的项目:

profile = request.user.get_profile() 
sales_items = profile.company.salesitem_set.all() 

我能否使用此规则限制我的搜索?

【问题讨论】:

    标签: django elasticsearch django-haystack


    【解决方案1】:

    您也可以在 SalesItemIndex 中索引公司 ID:

    class SalesItemIndex(SearchIndex, Indexable):
        ...
        company = IntegerField(model_attr='company_id')
    

    并直接在SearchQuerySet中过滤:

    sales_items = salesitem_set.filter(company=profile.company_id)

    【讨论】:

    • 这听起来很有希望。我的假设是否正确,即我需要滚动自己的 SearchForm 才能访问 SearchQuerySet 并执行您的建议?
    • @Kave 如果你的意思是haystack.forms.SearchForm,它支持__init__ 中的searchqueryset。所以像SearchForm(searchqueryset=sqs) 这样的东西很好。另外,为了方便,我想在对应的 Django 模型上定义一个get_searchqueryset() 方法。
    猜你喜欢
    • 2014-09-25
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多