【问题标题】:Django Haystack: Filtering by object propertiesDjango Haystack:按对象属性过滤
【发布时间】:2017-09-18 16:12:52
【问题描述】:

我正在尝试构建一个页面,该页面呈现搜索到的 Oscar 产品并使用 GET 属性按其类别过滤它们。我正在覆盖 get_queryset 并从那里构建我的对象列表

class ProductSearchView(ListView):
    model = Product
    template_name = "productsearch/product_list.html"
    queryset = Product.objects.none()

    def get_queryset(self):
        word_query_attr = self.request.GET.get('q', None)  # word query
        sqs = SearchQuerySet().models(Product).filter(Q(title__icontains=word_query_attr) |
                                                  Q(category__name__icontains=word_query_attr) |
                                                  Q(upc__icontains=word_query_attr) |
                                                  Q(description__icontains=word_query_attr))
        qs = Product.objects.all()

        if self.request.GET.get('cat', None):
            cat_attr = self.request.GET.get('cat', None)
            category = Category.objects.get(name=cat_attr)
            qs = qs.filter(categories__in=category.get_children())

我的问题是,我可以使用SearchQuerySet() 过滤结果对象中的字段吗? (在这种情况下,来自 Product 对象的类别)

如果没有,有没有一种有效的方法可以使用SearchQuerySet() 结果创建产品查询集? 我试过通过 ID 过滤

object_ids = [result.object.id for result in sqs]
qs = qs.filter(id__in=object_ids).distinct()

但有两个问题:它不可扩展(如 here 所述),当我处理大约 900 个结果时,一些查询非常慢。

【问题讨论】:

    标签: django django-haystack django-oscar


    【解决方案1】:

    我可能遗漏了一些东西,但是您示例中的 SearchQuerySet 过滤器已经受到类别名称的限制?您能否将该过滤器更改为 exact 而不是 icontains 并传递您的 cat GET 参数?

    sqs = SearchQuerySet().models(Product).filter(
        Q(title__icontains=word_query_attr) |
        Q(upc__icontains=word_query_attr) |
        Q(description__icontains=word_query_attr)
    )
    
    cat_attr = self.request.GET.get('cat')
    if cat_attr:
        sqs.filter(category__name__exact=cat_attr)
    

    我认为 Haystack 应该让你像这样链接过滤器。

    【讨论】:

    • 嗨!这么晚才回复很抱歉!有道理,我不知道我怎么没想到。让我测试一下解决方案,我会尽快回复您
    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2016-07-19
    相关资源
    最近更新 更多