2017-09-18 95 views
1

我試圖構建一個呈現搜索的Oscar產品的頁面,並使用GET屬性對它們的類​​別進行過濾。我重寫get_queryset,並從那裏建立我的對象列表Django Haystack:通過對象屬性進行篩選

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()通過從結果對象的字段來過濾? (在這種情況下,產品對象的類別)

如果沒有,是否有一種有效的方法可以使用SearchQuerySet()結果創建產品查詢集? 我已經試圖通過標識

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

過濾,但這裏有兩個問題:它是不可擴展的(如指出here)和一些疑問是,當我處理〜900分的結果很慢。

回答

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應該讓你像這樣的過濾器。

+0

嗨!這麼晚纔回復很抱歉!這是有道理的,我不知道我怎麼沒有想到這一點。讓我測試解決方案,然後我馬上回到你身邊 –

相關問題