2017-09-18 21 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()를 사용할 수있다? (이 경우 Product 객체의 범주)

그렇지 않은 경우 SearchQuerySet() 결과를 사용하여 제품 쿼리 세트를 만들 수있는 효과적인 방법이 있습니까? 내가 ID를

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

를 통해 필터링 시도했다 그러나 두 가지 문제가 있습니다 : 그것은 확장되지 않습니다 ( here을 언급 한 바와 같이) 및 일부 쿼리는 내가 ~ 900 개 결과 다루고있을 때 매우 느리다.

답변

2

내가 누락되었지만 예제의 SearchQuerySet 필터가 이미 카테고리 이름으로 제한됩니까? 필터를 icontains 대신 exact으로 변경하고 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) 

제 생각에는 건초 더미가 그런 필터를 연결시켜야한다고 생각합니다.

+0

안녕하세요! 늦은 답변 죄송합니다! 그 말이 맞습니다. 어떻게 생각하지 않았는지 모르겠습니다. 내가 해결책을 시험하게하면 나는 곧바로 당신에게 돌아갈 것이다. –