Django Haystack:按对象属性过滤

时间:2017-09-18 16:12:52

标签: django django-haystack django-oscar

我正在尝试构建一个页面,该页面呈现搜索到的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个结果时,一些查询非常慢。

1 个答案:

答案 0 :(得分:2)

我可能会遗漏某些内容,但您示例中的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应该让你像那样链接过滤器。