2017-09-18 8 views
1

J'essaye de construire une page qui rende des produits recherchés d'oscars et les filtre par leur catégorie en utilisant des attributs de GET. Je suis remplaçant get_queryset et la construction de ma liste d'objets à partir de làDjango Haystack: Filtrage par propriétés d'objet

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()) 

Ma question est, puis-je utiliser SearchQuerySet() pour filtrer à travers les champs à partir d'objets de résultat? (dans ce cas, les catégories des objets Product)

Sinon, y a-t-il un moyen efficace de créer un jeu de résultats produit en utilisant les résultats SearchQuerySet()? J'ai essayé filtrage par ID

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

Mais il y a deux problèmes: il n'est pas évolutive (comme indiqué here) et certaines requêtes sont très lents quand je fais face à 900 ~ résultats.

Répondre

2

Il se peut que quelque chose me manque, mais le filtre SearchQuerySet dans votre exemple est déjà limité par le nom de la catégorie? Pourriez-vous simplement changer ce filtre à exact au lieu de icontains et passer votre cat GET param? Je pense que Haystack devrait vous laisser des filtres de chaîne comme ça.

+0

Bonjour! Désolé pour la réponse tardive! C'est logique, je ne sais pas comment je n'ai pas pensé à ça. Laisse-moi tester la solution et je reviendrai vers toi –